为什么获取当前时间return的函数时间点错误

Why does the function about getting current time return a wrong time point

我正在使用 C++11 并编写了一个函数来获取当前时间点:

template <typename T = std::chrono::milliseconds>
using Clock = std::chrono::time_point<std::chrono::system_clock, T>;

// get current time point
template <typename T = std::chrono::milliseconds>
inline Clock<T> getCurrentTimePoint(int8_t timeZone = 0) {
    return std::chrono::time_point_cast<T>(std::chrono::system_clock::now()) +
        std::chrono::hours {timezone};
}

然而,我刚刚测试了这个函数,它给了我一个非常奇怪的输出。

auto now1 = std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now());
auto now2 = getCurrentTimePoint<std::chrono::seconds>();
LOG(INFO) << "debug - now1:" << now1.time_since_epoch().count() << " now2:" << now2.time_since_epoch().count();

LOG(INFO) 可以将流打印到日志文件中。所以在日志文件中,我得到了这个:

debug - now1:1641294039 now2:1537614039

所以,now1如预期的那样工作,但是now2真的很奇怪,因为它的值是大约三年前的时间点,即22/09/2018。

不过,我试着在这里做了一个演示:https://godbolt.org/z/ns3116e63,它总是给我一个正确的结果。

我真的很困惑。

我的机器是 Ubuntu 16.04.4 LTS。我正在使用 CMake 来编译我的项目。我在文件 CMakeLists.txt.

中添加了 add_definitions(-std=c++14)

更新

第二天我又测试了,这是结果。

我又添加了两个函数,除了名字之外完全一样:

std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> getCurrentTimePoint1(int8_t timeZone = 0) {
    return std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now()) + std::chrono::hours {timeZone};
}

std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> getCurrentTimePoint2(int8_t timeZone = 0) { // OK
    return std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now()) + std::chrono::hours {timeZone};
}

getCurrentTimePoint1给了我错误的结果,就像上面的now2一样。但是 getCurrentTimePoint2 给了我正确的结果,就像上面的 now1 一样。这真的很奇怪...

然后我添加了更多的功能,比如没有参数的功能来做更多的测试。在某些时候,getCurrentTimePoint1 也可以生成正确的结果!

似乎添加更多返回 std::chrono::time_point 的函数或多次调用这些函数可以解决这个问题!

好吧,这是一个非常愚蠢的错误。

template <typename T = std::chrono::milliseconds>
inline Clock<T> getCurrentTimePoint(int8_t timeZone = 0) {
    return std::chrono::time_point_cast<T>(std::chrono::system_clock::now()) +
        std::chrono::hours {timezone}; // typo error! timeZone, instead of timezone
}

变量 timezone 已被定义 (man7.org/linux/man-pages/man3/tzset.3.html) 并被 chrono 包含。这就是编译器没有产生任何错误的原因。