【问题标题】:Best way to convert Unix time_t to/from abitrary timezones?将 Unix time_t 转换为/从任意时区的最佳方法?
【发布时间】:2011-03-20 18:13:17
【问题描述】:

我的代码从外部源接收 time_t。然而,那个 time_t 并不是真正基于 UTC 纪元时间,我得到了一个时区字符串(例如,EDT、PST 等),它基于这个偏移的纪元。我需要将其转换为真正的基于 UTC 纪元的 time_t。

此外,我需要能够朝相反的方向前进,采用基于 UTC 纪元的 time_t 和时区,并创建偏移的 time_t,但在这种情况下,而不是像 EDT/PST 那样的时区)等,我有一个像“美国/纽约”这样的 Unix 风格的时区描述,并且需要根据夏令时转换为正确的时区,所以我需要从算法中恢复,包括偏移的 time_t 和正确的描述符(EDT,美国东部标准时间)。

我很确定我可以通过临时更改 tzset() 以及分解时间、time_t 和 timeval 之间的一些转换组合来解决这个问题,但是这样做总是会让我的大脑受伤并让我感觉自己在遗漏了一些明显的东西。任何人都可以推荐一些代码或 sudo-code 来执行此操作或至少是正确的方法吗?

【问题讨论】:

  • 任何语言中的时间操纵都没有明显或适当(或清楚或快乐)的地方。 tzset() 和 localtime()/strftime() 是最好的,imo。

标签: c linux gcc timezone time-t


【解决方案1】:

time_t 以秒为单位,因此只需将您的 time_t 值偏移时区偏移小时数的 3600 倍。只要您有明确的偏移量(即 EST 或 EDT 而不是 US/Eastern 或 EST5EDT 或诸如此类),那么这真的很简单并且不容易出错。

【讨论】:

  • 谢谢,在一个方向我确实有 EDT/EST,但在另一个方向我只有美国/纽约。是否有标准函数来获取 timezeone(EDT、EST 等)并返回小时偏移量?
  • 不,不幸的是,时区名称不是全球唯一的。如果您只需要支持美国时区,您可以自己对其进行硬编码并完成。
【解决方案2】:

these functions 中的任何一个人会帮助你吗? localtime()、gmtime() 等

【讨论】:

  • 这些是我通常用于此类任务的工具以及其他几个时间操作命令。我遇到的麻烦是找出所有不同命令和数据格式的正确链接以及转换以实现我想要的,因为它们都没有完成实际的工作。
猜你喜欢
  • 2010-12-21
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2017-03-21
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多