1

这个问题已经让我难过一分钟了。我正在开发一个用 C++ 编写的程序,我需要能够在两个不同的服务器之间发送以 ISO8601 编码的时间。这里的主要坚持者似乎是 Windows。

到目前为止,我已经strptime()从 NetBSD 移植过来,以便轻松地从网络上读取日期/时间字符串并将其转换为tm*. 但是,在正确地将其转换为本地化时,我完全被难tm*住了,因此我可以使用strftime(). 一种天真的方法是简单地取 和 之间的差异localtime(time(0))gmtime(time(0))但这对于涉及夏令时的任意日期是不一致的。

到目前为止,我一直采用的方法是仅使用 POSIX 日期和时间函数,并在必要时编写 Windows 填充程序(strptime()目前已完成,如果有必要,timegm()可能在将来完成)。我宁愿继续这样做,但简单的事实是tm*Windows 中的结构缺少 Linux 和 OSX 所做的一些字段,所以我可能别无选择,只能编写由#if WIN32. 我也真的不希望为此增加动力。

4

1 回答 1

1

给定 astruct tm *utc_tm你可以把它变成一个time_t utcusing (nonportable) timegm,然后把它变成一个struct tm *local_tmusing localtime

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)*86400
于 2012-09-21T13:06:42.053 回答