c – 打印/读取时的奇怪行为
发布时间:2020-12-16 07:02:43 所属栏目:百科 来源:网络整理
导读:我试图将std :: time_point保存到std :: stream并将其读回.一个问题是使用标准功能’失去’一个小时的某个地方.也就是说,我读的时间比我写的时间少了1个小时.我怀疑我需要在某处设置夏令时.我整理了一个小程序,它将时间打印到std :: stringstream并将其读回.
我试图将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) 我想我的问题是: B)当我在程序结束时取消注释三行时代码是怎么回事?对我来说这看起来像个错误.有人想在他们的平台上试试吗? 解决方法
我想我们正在查看%Z说明符的错误,也许还有%z说明符,还不确定.
我将更多地研究这些错误的原因.但是,我想继续发布,以便为您提供解决方法.我相信如果您对输入tm进行零初始化,并且始终假设它与您的本地时区相关,那么您将消除您的错误: std::tm time_in{0}; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |