这个问题已经难住我好一分钟了。我正在开发一个用C++编写的程序,我需要能够在两个不同的服务器之间发送ISO8601编码的时间。这里最棘手的问题似乎是Windows。
到目前为止,我已经从NetBSD移植到strptime()上,以便轻松地从网络读取日期/时间字符串并将其转换为tm*。然而,当涉及到正确地将其转换为本地化的tm*时,我完全被难住了,这样我就可以使用strftime()在他们当地的时区向用户显示这个时间。一种天真的方法是简单地采用localtime(time(0))和gmtime(time(0))之间的差异,但对于涉及夏令时的任意日期来说,这并不一致。
到目前为止,我一直采用的方法是只使用POSIX日期和时间函数,并在必要时编写Windows shims (到目前为止,对于strptime()和timegm(),如果需要的话,将来可能会这样做)。我更愿意继续这样做,但简单的事实是,Windows中的tm*结构缺少Linux和OSX所缺少的一些字段,因此我可能别无选择,只能编写由#if WIN32保护的不可移植代码。我也真的不希望为此而引入boost。
发布于 2012-09-21 21:06:42
给定一个struct tm *utc_tm,您可以使用(不可移植的) timegm将其转换为time_t utc,然后使用localtime将其转换为struct tm *local_tm
time_t utc = timegm(utc_tm);
struct tm local_tm;
localtime_r(&utc, &local_tm);据我所知,timegm最简单的实现包括使用月表和闰年计算自己进行转换。或者,如果您的strptime正确填写了tm_yday,则可以使用https://stackoverflow.com/a/9076848/567292中的公式
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
(tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400https://stackoverflow.com/questions/12530349
复制相似问题