【问题标题】:Thread-safe timezone-specific time display in C/C++C/C++ 中的线程安全时区特定时间显示
【发布时间】:2009-12-23 04:04:49
【问题描述】:

我有一个需要向用户显示某些日期的多线程应用程序。日期使用 UTC Unix 时间值存储。但是,日期必须以用户所在的时区显示,而不是本地服务器时间或 UTC。基本上,我需要一个这样的函数:

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 环境变量会是一种选择。

【问题讨论】:

    标签: c++ c time


    【解决方案1】:

    如果您以秒为单位知道用户与 UTC 的偏移量,您只需从 time_t 中添加/减去它,然后将结果传递给 gmtime_r

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

    【讨论】:

    • 这是一个非常非常基本的答案,对于许多时区来说实际上是不可能的,因为系统库不能准确地跟踪许多变化。仅仅一个偏移量是不够的,因为它会随着时间的推移而变化。
    【解决方案2】:

    作为 caf 答案的推论,&lt;tzinfo.h&gt; 标头可用于获取给定时区的 UTC 偏移量。公共领域时区数据库包含大量信息;在我使用过的 Linux 发行版上,它可以在 /usr/share/zoneinfo 中浏览,而且我相信 Apple 会将它与 iTunes 打包为 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 早 5 小时,这会为您提供与 UTC 的偏移量。

    【讨论】:

    • 你有 的链接吗?我在 Google 上只能找到 Python 和 Ruby 库。感觉有点像“漫长的道路”,必须运行一个外部程序来取回一个我必须解析的字符串,所有这些只是为了找出纽约现在离 UTC 有多远。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多