2009-12-23 133 views
1

我有一个多线程应用程序需要向用户显示某些日期。日期使用UTC Unix时间值进行存储。但是,日期必须显示在用户的时区中,而不是本地服务器时间或UTC。基本上,我需要这样的功能:C/C++中线程安全的时区特定时间显示

struct tm *usertime_r(const time_t *timer, struct tm *result, const int timezone) { 
    <just like localtime_r, except it uses UTC+timezone as the timezone> 
} 

此功能必须是线程安全的,所以我不认为设置TZ环境变量将是一种选择。

回答

3

如果您知道用户从UTC以秒为单位的偏移量,则只需从time_t中添加/减去该值,并将结果传递给gmtime_r即可。

例如,澳大利亚东部夏令时间为+11,这意味着您会将(11*3600)添加到时间值。

+2

这是一个非常非常基本的答案,因为系统库不能准确跟踪许多更改,所以对于许多时区实际上并不可行。只是抵消是不够的,因为它随时间而变化。 – 2013-12-31 17:03:18

1

作为caf答案的推论,<tzinfo.h>标题可用于获取给定时区的UTC偏移量。公共领域时区数据库包含大量信息;在我用过的Linux发行版上,它可以在/usr/share/zoneinfo中浏览,我相信苹果将它与iTunes for Win32一起打包。

从上大多数发行版在命令行中,你可以这样做:

# it's easy to find out what timezones are available 
$ file /usr/share/zoneinfo/{US/Eastern,UTC} 
/usr/share/zoneinfo/US/Eastern: timezone data 
/usr/share/zoneinfo/UTC:  timezone data 

# now examine them 
$ zdump US/Eastern UTC 
US/Eastern Wed Dec 23 00:11:31 2009 EST 
GMT   Wed Dec 23 05:11:31 2009 UTC 

就像我们/东方目前在标准时间(它会在暑假期间打印EDT),而且它的五小时UTC,它可以为您提供与UTC的偏移量。

+0

你有链接?我可以在Google上找到的是Python和Ruby库。这感觉有点像“漫长的路要走”,必须运行一个外部程序才能找回一个字符串,然后我必须解析,所有这些都只是为了找出纽约距离UTC有多远。 :-( – 2014-09-02 11:47:26