【发布时间】:2013-06-30 03:16:06
【问题描述】:
我当前的模式(对于 unix)是调用gettimeofday,将tv_sec 字段转换为time_t,将其传递给localtime,然后将结果与tv_usec 结合起来。这给了我一个完整的日期(年、月、日、小时、分钟、秒、纳秒)。
我正在尝试将我的代码更新为 C++11,以实现可移植性和一般的良好实践。我能够做到以下几点:
auto currentTime = std::chrono::system_clock::now( );
const time_t time = std::chrono::system_clock::to_time_t( currentTime );
const tm *values = localtime( &time );
// read values->tm_year, etc.
但我被困在毫秒/纳秒上。一方面,to_time_t 声称舍入是实现定义的(!)所以我不知道 22.6 秒的最终读数是否实际上应该是 21.6,另一方面我不知道如何得到毫秒数前一秒(标准保证秒数是正常的吗?即我可以得到自纪元以来的总毫秒数并对其取模吗?即使这样也感觉很丑)。
我应该如何以毫秒为单位从std::chrono::system_clock 获取当前日期?
【问题讨论】:
-
如果 std::time_t 的精度较低,则由实现定义该值是舍入还是截断。 无论哪种情况,22.6 都不会是 21.6,所以不用担心。
-
@TomKnapen 但是 21.6 可以变成 22.6,如果它被舍入而不是截断秒。也许我的措辞不是最好的,但这就是我的意思。
-
根据我的经验,将 21.6 舍入等于 22,将 21.6 截断等于 21。因此,无论哪种方式,除非您自己添加“小数”部分,否则 21.6 不可能变成 22.6。
-
@TomKnapen 但关键是我自己am添加了小数部分;我将从(舍入或截断的)
time_t值中获取秒数,并从原始时钟中获取小数部分。