我试图将std :: time_point保存到std :: stream并将其读回.一个问题是使用标准功能’失去’一个小时的某个地方.也就是说,我读的时间比我写的时间少了1个小时.我怀疑我需要在某处设置夏令时.我整理了一个小程序,它将时间打印到std :: stringstream并将其读回.
#include <iomanip> #include <iostream> #include <sstream> #include <chrono> #include <ctime> using std::chrono::system_clock; namespace chrono = std::chrono; void test(); int main(int argc,char** argv) { std::stringstream ss; auto start = system_clock::Now(); std::time_t ts = system_clock::to_time_t(start); std::tm time_out = *std::localtime(&ts); ss << std::put_time(&time_out,"%Y-%m-%d %H:%M:%s %Z") << '\n'; std::cout << ss.str() << std::endl; std::tm time_in; ss >> std::get_time(&time_in,"%Y-%m-%d %H:%M:%s %Z"); std::cout << "Are time dsts equal? : " << (time_out.tm_isdst == time_in.tm_isdst) << '\n'; std::time_t rawTime = std::mktime(&time_in); auto end = std::chrono::system_clock::from_time_t(rawTime); std::cout << "Are time points equal? : " << (start == end) << '\n'; // print the trouble makers std::time_t start_time = system_clock::to_time_t(start); std::time_t end_time = system_clock::to_time_t(end); std::cout << "times: \n" << '\t' << std::put_time(std::localtime(&start_time),"%c %z") << '\n' << '\t' << std::put_time(std::localtime(&end_time),"%c %z") << '\n'; // this is a source of strange behavIoUr... // std::cout << "Difference: " // << chrono::duration_cast<chrono::seconds>(start - end).count() // << std::endl; return 0; }
最奇怪的是该程序打印以下内容:
Are time dsts equal? : 1 Are time points equal? : 0 times: Tue Dec 11 19:26:24 2012 +0000 Tue Dec 11 19:26:24 2012 +0000
当我在程序结束时取消注释3行(打印时间点之间的差异)时,结果是:
Are time dsts equal? : 0 Are time points equal? : 0 times: Tue Dec 11 19:29:40 2012 +0000 Tue Dec 11 18:29:40 2012 +0000 Difference: 3600
请注意,dst(夏令时)突然不相等,时间也不同.
我在Mac OS X 10.8.2上使用libc和XCode46-DP2.我使用的铿锵版本是Apple clang 4.1版和clang版本3.2(trunk 167239)
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。