为什么获取当前时间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
包含。这就是编译器没有产生任何错误的原因。
我正在使用 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
包含。这就是编译器没有产生任何错误的原因。