这两个现有的答案都很好。但只要你用C++是我鼓励你类型的数据成员:
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
我知道这是一个丑陋的拗口,但它可以很容易地做出更漂亮。它也很容易使用。这将有助于防止C++代码中的运行时错误。
让它更漂亮
我推荐这种使用模板:
template <class Duration>
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
现在你可以让你的数据成员的类型为:
sys_time<std::chrono::milliseconds> time_;
这是更可读,和它确切地说保留您存储一个时间点的语义,而不是一个仲裁者y数量,或柚子卡路里的数量。
类型安全
比方说,从半年后的现在,你重新访问这些代码,你写的:
auto z = x.time_ + y.time_;
如果您以前曾决定给time_
型std::int64_t
,或std::chrono::milliseconds::rep
,那么上面的新代码行编译并创建运行时错误。添加两个时间点是没有意义的。明天+今天是无意义的。
不过,如果你之前已经决定放弃time_
型sys_time<milliseconds>
我建议,代码创建z
不会编译上面的线。类型系统在编译时间检测到逻辑错误。现在你不得不立即重新访问你的逻辑,并发现你为什么试图增加两个时间点。也许它只是一个类型o,你的意思是减去它们(这是合乎逻辑的,编译,并且产生duration
类型milliseconds
)。
使用
易于您可以指定now()
您time_
数据成员用这个简单的语法:
using namespace std::chrono;
time_ = time_point_cast<milliseconds>(system_clock::now());
现在time_
只是另一个system_clock
基础的time_point
但与milliseconds
精度。对于输出到JSON,你可以得到与内部整型值:
json_stream << time_.time_since_epoch().count();
对于从JSON可以在分析中:
std::int64_t temp;
json_stream >> temp;
time_ = sys_time<milliseconds>{milliseconds{temp}};
是的,我是你的btw的忠实粉丝:D会反过来使用你的日期库。 –
@hg_git:太棒了,谢谢。 'date :: sys_time'是在date.h中预制的。 –