【问题标题】:Timestamp of 1st January 1970 turns to -36001970 年 1 月 1 日的时间戳变为 -3600
【发布时间】:2020-02-15 21:07:41
【问题描述】:

当我尝试将德国日期(更具体的出生日期)格式转换为 unix 时间戳时,我得到的是 -3600 而不是 0。

也许是一些夏天的事情?

$value = '01.01.1970';
$date = DateTime::createFromFormat ('d.m.Y', $value);
$date->setTime(0, 0);
$value = $date->getTimestamp();

echo $value; // -3600

我一直认为是 0。在处理这种情况时,最佳做法是什么?时区是 GMT+1,以防万一。我什至尝试过 01.01.1850,将其转换为时间戳,然后返回格式化日期。在家里工作得很好,但在工作中显示为 1849 年 12 月 31 日。

【问题讨论】:

    标签: php datetime timestamp timezone


    【解决方案1】:

    我怀疑,如果您检查 date_default_timezone_get,您的服务器的时区未设置为 UTC。我能够像这样复制这种行为:

    date_default_timezone_set('Europe/Berlin');
    $value = '01.01.1970';
    $date = DateTime::createFromFormat ('d.m.Y', $value);
    $date->setTime(0, 0);
    $value = $date->getTimestamp();
    

    由于时区差异,柏林时区中的1970-01-01 00:00:00 实际上对应于负的 Unix 时间戳-3600。 Unix 时间戳 0 仅对应于 1970-01-01 00:00:00 UTC - 负值仅表示该时刻之前的时间。

    【讨论】:

      【解决方案2】:

      这是一个很好的问题。一个甚至让我失望的,because of this

      但是,在您的情况下,德国就像您在 UTC+01:00 所说的那样,因此在您的系统上,$date 的值是 1970-01-01T00:00:00+01:00

      如果您反转情景并尝试找出与时间戳0 对应的日期是什么,它应该可以帮助您了解时区如何使用时间戳。

      $date = DateTime::createFromFormat ('U', '0');
      $date->setTimezone(new DateTimeZone('Europe/Berlin'));
      echo $date->format(DATE_ATOM); // 1970-01-01T01:00:00+01:00
      

      由于时间戳是与 UNIX 纪元的相对时间差(以秒为单位),因此不同时区的时间不同。该计数从 1970 年 1 月 1 日 UTC 午夜开始。 1970 年英国和德国都在 UTC+01:00,而 UNIX 时代开始于1970-01-01 01:00:00

      就如何最好地处理这个问题而言,嗯……这是基于意见的。可能大多数人会告诉您以 UTC 处理时间,这样您就不会遇到诸如此类的奇怪问题,而只会转换为显示的正确时区,甚至the great Jon Skeet had different opinion

      【讨论】:

        猜你喜欢
        • 2012-07-06
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 2018-03-21
        • 2012-11-09
        • 2020-06-18
        相关资源
        最近更新 更多