【发布时间】:2010-11-16 11:22:18
【问题描述】:
我正在寻找我认为非常简单的东西 - 给定特定时区中的本地 Unix 时间(指定为字符串,例如“America/New_York” - 请注意,不是我的当地时间),得到对应的GMT时间值。即,类似于
time_t get_gmt_time(time_t local_time,
const char* time_zone);
虽然听起来很简单,但我能找到的最接近的是 timegm 手册页中的以下代码 sn-p:
#include <time.h>
#include <stdlib.h>
time_t
my_timegm(struct tm *tm)
{
time_t ret;
char *tz;
tz = getenv("TZ");
setenv("TZ", "", 1);
tzset();
ret = mktime(tm);
if (tz)
setenv("TZ", tz, 1);
else
unsetenv("TZ");
tzset();
return ret;
}
肯定有比这种好战而不是线程安全的憎恶更好的方法,对吧?对吧??
【问题讨论】:
-
好问题。事情真的几乎那么糟糕。全世界似乎都认为你永远不会有兴趣假装在不同的时区,或者需要转换到除 UTC 之外的任何时区。这是个问题。
-
这里对于
time_t和struct tm的含义有些混淆。在所有类似 UN*X 的系统上,time_t/time()是“自 'epoch' 以来的秒数”(UTC 0:00 01/01/1970),可以通过localtime()转换为struct tm(给出时区校正的结果)或gmtime()(给出UTC的结果),分别是它们的可重入版本。mktime()是相反的,将struct tm转换为time_t。因此,您编码的只是mktime()变相? -
我也对线程安全问题感兴趣。如何以线程安全的方式转换到/从任意时区,不一定是“当前”时区。不仅转换,还使用strftime打印出区域。
-
现在是 2015 年,我仍在寻找线程安全的解决方案