【问题标题】:Get timezone offset in PHP given a unix timestamp给定一个unix时间戳,在PHP中获取时区偏移量
【发布时间】:2010-12-04 22:21:07
【问题描述】:

我有一个来自数据库的 Unix 时间戳,该数据库(不幸的是)位于某个时区,时区为 +3600 或 +7200,具体取决于它是否为 DST。这在以前从来都不是问题,但我们的网站目前正在向更多的国际受众转移,并且由于 Javascript 与所述时间戳的交互,我需要转换时间戳而没有任何偏移。

那么,给定一个 Unix 时间戳,我如何在该时间戳的时刻获取时区的偏移量?我正在查看 PHP 文档,但是有太多的日期/时间函数我有点迷路了。

我使用的是 PHP 5.2.3

【问题讨论】:

  • 我不认为只有 UNIX-Timestamp 才能做到这一点......因为它没有存储 any 时区信息,只是从 01/01 开始的秒数/1970.
  • @bobby:虽然它不存储任何时区信息,但 unix 时间被定义为 UTC。
  • @kjetijor:但是,如果生成了 UNIX 时间戳,或多或少,它不是本地化的吗?
  • @Bobby:仅当您的服务器设置有问题时。

标签: php timezone timestamp unix-timestamp


【解决方案1】:

你可以用这个:

$timezone_offset = date('O');

它将以小时为单位返回格林威治时间 (GMT) 的时差。

[source]

【讨论】:

    【解决方案2】:

    我又觉得自己回答自己的问题很傻,但我刚刚找到了gmstrftime 函数。它似乎正是我想要的。不过还是谢谢大家!

    【讨论】:

      【解决方案3】:

      如果您使用 unix 时间戳表示 unix 时间(自纪元以来的秒数),则偏移量始终为 0。纪元定义为 1970 年 1 月 1 日 00:00:00 UTC。注意 UTC,其偏移量为 0。

      时区偏移和 dst 的应用由将 unix 时间戳转换为日期/时间结构的库处理。 (我不知道 php,但即在 C 中,localtime 函数采用 unix 时间戳,从环境或 /etc/localtime 文件应用时区信息,并输出秒、分钟、小时等结构)。

      【讨论】:

        【解决方案4】:

        在一般情况下您不能这样做。 Unix 时间戳只是自 Unix 纪元以来的秒数,不包含任何时间戳信息。

        可能对您有用的一件事是确定给定时间戳是否在 DST 生效期间出现,然后进行相应调整。但是,这种方法会在边界附近失败(因为在 DST 开始后和结束前的一小时内,每个时间戳都有 2 个含义)。

        将来,您最好将时间戳存储在 UTC 中,以避免此类问题。

        【讨论】:

        • 是的,我知道我应该如何存储时间戳,但是当我开始在这里工作时,有很多这样的现有数据。所以我就顺其自然...
        • Unix 时间是 UTC,它有偏移量 0 并且没有 DST 调整。无需调整您的 unix 时间戳。
        • 时间戳来自 PHP time() 函数。它获取 unix 时间并应用服务器的时区偏移量。
        • @kjetijor - 这是真的,但我认为通过“Unix时间戳”,OP只是指一个数字,表示自1970年1月1日00:00以来的秒数,在某个时区(从他的回答看来,格林威治标准时间是夏令时调整)。
        【解决方案5】:

        这样可以解决问题吗?

        $tz = date("O", $time);
        

        你也可以这样做:

        从这里开始:

        http://www.php.net/manual/en/function.date.php

        【讨论】:

        • 当然,这只适用于未来,因为您不能仅从 Unix 时间戳中知道创建时区时的时区是什么。
        猜你喜欢
        • 2018-09-11
        • 2012-08-24
        • 1970-01-01
        • 2023-04-07
        • 2010-10-17
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多