在C ++中将毫秒转换为小时:分钟:秒:毫秒

Ber*_*jay 0 c++

我正在寻找一种使用C ++以这种格式打印毫秒的方法:

cout << hours << " Hours : " << minutes << " Minutes : " << seconds << " Seconds : " << milliseconds << " Milliseconds" << endl;
Run Code Online (Sandbox Code Playgroud)

我知道对此有很多重复的问题。但是他们都没有真正处理如何以毫秒为单位获取余数。有一些使用Java来做到这一点,但我想要一个C ++解决方案。

编辑:

我想澄清这个问题。我希望获取一个时间值,该时间值是程序运行并以清晰的格式为用户打印该时间所需的时间。获得标准的hr:min:sec很简单。但是,包括所有剩余的毫秒数会使我震惊。

Yak*_*ont 7

std::string format_duration( std::chrono::milliseconds ms ) {
    using namespace std::chrono;
    auto secs = duration_cast<seconds>(ms);
    ms -= duration_cast<milliseconds>(secs);
    auto mins = duration_cast<minutes>(secs);
    secs -= duration_cast<seconds>(mins);
    auto hour = duration_cast<hours>(mins);
    mins -= duration_cast<minutes>(hour);

    std::stringstream ss;
    ss << hour.count() << " Hours : " << mins.count() << " Minutes : " << secs.count() << " Seconds : " << ms.count() << " Milliseconds";
    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

现场例子

将其扩展到天/年/等应该很容易(但是,在之前,天/年/等没有预定义的std :: chrono持续时间类型)。

但是我可以做得更好。

template<class Duration>
struct split_duration {
  Duration d;
  std::chrono::milliseconds leftover;

  split_duration( std::chrono::milliseconds ms ):
    d( std::chrono::duration_cast<Duration>(ms) ),
    leftover( ms - std::chrono::duration_cast<std::chrono::milliseconds>(d) )
  {}
};


template<class...Durations>
std::tuple<Durations...> durations( std::chrono::milliseconds ms ) {
  std::tuple<std::optional<split_duration<Durations>>...> tmp;
  ( (void)(
       (void)std::get<std::optional<split_duration<Durations>>>(tmp).emplace( ms ),
       ms = std::get<std::optional<split_duration<Durations>>>(tmp)->leftover
     ), ...
  );
  return std::make_tuple( std::get<std::optional<split_duration<Durations>>>( tmp )->d... );
}

template<class T>
struct tag_t {};
template<class T>
constexpr tag_t<T> tag = {};

inline std::string duration_name( tag_t<std::chrono::milliseconds> ) { return "ms"; }
inline std::string duration_name( tag_t<std::chrono::seconds> ) { return "Seconds"; }
inline std::string duration_name( tag_t<std::chrono::minutes> ) { return "Minutes"; }
inline std::string duration_name( tag_t<std::chrono::hours> ) { return "Hours"; }
// inline std::string duration_name( tag_t<std::chrono::days> ) { return "Days"; }
// inline std::string duration_name( tag_t<std::chrono::years> ) { return "Years"; }

template<class...Durations>
std::string format_duration( std::chrono::milliseconds ms ) {
    auto split = durations<Durations...>(ms);

    std::stringstream ss;

    (
        (void)( ss << duration_name(tag<Durations>) << ": " << std::get<Durations>(split).count() << " " ), ...
    );

    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

天/年需要,其他所有东西都是

您只需调用format_durations<Durations...>( some_ms ),然后即可获得基于的格式化字符串Durations...。您必须从头到尾进行。

durations<Durations...>为您提供必须最少的时间的元组细分;然后,您可以根据需要在格式化之前对其重新排序。

重复的持续时间类型会导致编译时错误,因为它std::get死于可怕的模棱两可的死亡。

现场例子


Rem*_*eau 6

int milliseconds = ...;

int seconds = milliseconds / 1000;
milliseconds %= 1000;

int minutes = seconds / 60;
seconds %= 60;

int hours = minutes / 60;
minutes %= 60;

cout << hours << " Hours : " << minutes << " Minutes : " << seconds << " Seconds : " << milliseconds << " Milliseconds" << endl;
Run Code Online (Sandbox Code Playgroud)


小智 5

也许你正在寻找这样的东西:

#include <iostream>
using namespace std;

int main() {
//Value chosen to be 1 hour, 1 minute, 1 second, and 1 millisecond
long milli = 3661001;
//3600000 milliseconds in an hour
long hr = milli / 3600000;
milli = milli - 3600000 * hr;
//60000 milliseconds in a minute
long min = milli / 60000;
milli = milli - 60000 * min;

//1000 milliseconds in a second
long sec = milli / 1000;
milli = milli - 1000 * sec;


cout << hr << " hours and " << min << " minutes and " << sec << " seconds and " << milli << " milliseconds." << endl;
}
Run Code Online (Sandbox Code Playgroud)