使用strftime()获取utc时间戳

使用strftime()获取utc时间戳,第1张

概述我正在尝试使用strftimefunction将当前utc时间编码为字符串: time_t now;struct tm nowLocal;struct tm nowUtc;now = time(NULL);localtime_r(&now, &nowLocal);gmtime_r(&now, &nowUtc); 到目前为止一切顺利:nowLocal包含我的时区(CET)中的当前时间,n 我正在尝试使用strftimefunction将当前utc时间编码为字符串:

time_t Now;struct tm NowLocal;struct tm NowUtc;Now = time(NulL);localtime_r(&Now,&NowLocal);gmtime_r(&Now,&NowUtc);

到目前为止一切顺利:NowLocal包含我的时区(CET)中的当前时间,NowUtc包含utc时间,差别完全根据tm_gmtoff值:

NowLocal: {tm_sec = 28,tm_min = 27,tm_hour = 13,tm_mday = 23,tm_mon = 4,tm_year = 112,tm_wday = 3,tm_yday = 143,tm_isdst = 1,tm_gmtoff = 7200,tm_zone = 0x8127a38 "CEST"}NowUtc: {tm_sec = 28,tm_hour = 11,tm_isdst = 0,tm_gmtoff = 0,tm_zone = 0x3e9907 "GMT"}

然后我用“%s”格式调用strftime()来获取epoch以来的秒数:

char tsFromLocal[32];char tsFromUtc[32];strftime(tsFromLocal,sizeof(tsFromLocal),"%s",&NowLocal);strftime(tsFromUtc,sizeof(tsFromUtc),&NowUtc);

结果对我来说很奇怪.我希望从两个strftime()调用中得到完全相同的字符串,因为%s格式被描述为:

自纪元以来的秒数,即自1970-01-01 00:00:00 UTC以来.除非有闰秒支持,否则闰秒不计算在内.

但我有两个不同的价值观:

tsFromLocal:"1337772448"tsFromUtc: "1337768848"

而且差异不是7200(tm_gmtoff)而是3600.任何人都可以解释这种行为吗?或者这是一个错误?

我这样做的原因是我需要通过网络传输时间值,并将其与目标机器上可以处于不同时区的当前时间进行比较.在目标机器上我想:

struct tm restoredUtc;time_t restored;strptime(tsFromUtc,&restoredUtc);restored = timegm(&restoredUtc);

但我得到了:

restoredUtc:{tm_sec = 28,tm_hour = 12,tm_zone = 0x8127a38 "CEST"}

所以strptime()无论如何都要根据当前时区设置tm_zone.但即使我使用timelocal()而不是timegm(),我也不会得到正确的值,因为它应该是11:28:28 CEST而不是12:27:28 CEST.这个错误是否与strftime()的不同结果有关?

对此后期部分有何评论?

解决方法 你可能最好只使用GMT,因为gmtime_r总会在各处给你相同的答案.如果一台机器想要在当地时间显示,这可以在以后完成,但坚持一个时区进行存储和网络传输是一个好主意,并且GMT值很容易获得. 总结

以上是内存溢出为你收集整理的使用strftime()获取utc时间戳全部内容,希望文章能够帮你解决使用strftime()获取utc时间戳所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存