现有的两个答案都很好。但只要您使用 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_;
这更具可读性,它完全保留了您存储时间点的语义,而不是任意数字或葡萄柚中的卡路里数。
类型安全
假设六个月后你重新访问这段代码并且你写了:
auto z = x.time_ + y.time_;
如果您之前决定将time_ 输入std::int64_t 或std::chrono::milliseconds::rep,那么上面的新代码行将编译并产生运行时错误。添加两个时间点。明天+今天是荒谬的。
但是,如果您之前决定按照我的建议将time_ 输入sys_time<milliseconds>,则上面创建z 的代码行无法编译。 类型系统检测到逻辑错误在编译时。现在你不得不立即重新审视你的逻辑并发现你为什么要尝试添加两个时间点。也许它只是一个类型-o,而您打算减去它们(这是合乎逻辑的,编译并产生milliseconds 类型的duration)。
易于使用
您可以使用以下简单语法将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}};