6

我在 Boost C++ 日期时间库中发现了一个奇怪的结果。microsec_clock和之间存在不一致second_clock,我不明白为什么会这样。我正在使用 Windows XP 32 位

我的代码片段:

using namespace boost::posix_time;
...
ptime now = second_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl;
ptime now_2 = microsec_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl;
...

我期望的打印输出是当前时间,没有毫秒和毫秒。但是,我在我的电脑中拥有的是:

2009-10-14T16:07:38  
1970-06-24T20:36:09.375890

我不明白为什么在我的microsec_clock时代会有一个奇怪的日期(1970 年???)。Boost 的相关文档:链接到 boost 日期时间

4

3 回答 3

5

不知道你可能出了什么问题;完全相同的代码对我有用。

$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
使用命名空间 boost::posix_time;
int main() {
    现在 ptime = second_clock::universal_time();
    std::cout << "当前时间是:"<< to_iso_extended_string(now)<< std::endl;
    ptime now_2 = microsec_clock::universal_time();
    std::cout << "当前时间是:"<< to_iso_extended_string(now_2)<< std::endl;
    返回0;
}
^D
$ c++ -lboost_date_time test.cc 
$ ./a.out
当前时间是:2009-10-14T16:26:55
当前时间是:2009-10-14T16:26:55.586295

在实现方面,second_clock使用timemicrosec_clock使用gettimeofdayGetSystemTimeAsFileTime在下面,取决于平台。您的平台出现问题 - 您的操作系统和版本是什么?


你的 Boost 版本是多少?如果是 1.38 或更低版本,请升级到 1.39 或手动将修复应用到#2809 。

--- boost/date_time/filetime_functions.hpp(修订版 53621)
+++ boost/date_time/filetime_functions.hpp(修订版 53622)
@@ -96,9 +96,7 @@
     {
         /* shift 是 1970-Jan-01 和 1601-Jan-01 之间的差异
         * 以 100 纳秒为间隔 */
- 常量 uint64_t c1 = 27111902UL;
- 常量 uint64_t c2 = 3577643008UL;// 在没有 'UL' 的情况下发出警告
- 常量 uint64_t shift = (c1 << 32) + c2;
+ 常量 uint64_t 移位 = 116444736000000000ULL;// (27111902 << 32) + 3577643008

         联合{
             FileTimeT as_file_time;

Windows FileTime 与 UNIX 时间有不同的偏移量,并且之前在 Boost 中的代码不会在某些优化编译器中生成正确的偏移量差异。

于 2009-10-14T16:44:57.760 回答
1

1970 年的日期很可能来自unix 时间的表示方式,即 1970 年 1 月 1 日的秒数。我猜想也许它以某种方式以毫秒为单位获取系统正常运行时间并将其解释为自 1970 年 1 月 1 日以来的秒数。这个日期的正常运行时间会超过 4 小时。

于 2009-10-14T16:36:57.277 回答
1

与 不同second_clock的是,microsec_clock::universal_time文档中提到:根据计算机设置返回 UTC 时间。
你应该检查你的硬件时钟设置(或者微秒从哪里得到它的值)。

编辑:
如果它与您的计算机设置无关,则它必须是 boost 中的不当行为,我非常怀疑。

于 2009-10-14T16:41:47.720 回答