【问题标题】:PHP - using date to find out daylight savings timePHP - 使用日期找出夏令时
【发布时间】:2013-04-29 21:02:29
【问题描述】:

我想给 date() 一个日期,如果该日期是否为 DST,则让它返回。在 Windows 7 机器上通过 xampp 运行 PHP 5.4.7。运行 PHP 5.2.8 的 linux 机器无论我给出什么日期都会返回 0。

我的代码有什么问题?

echo date('I', strtotime('30-Mar-2013'));
# should return a 1 but returns 0

echo date('I', strtotime('30-Mar-2013 America/Los_Angeles'))."<br>"; # returns 0
echo date('I', strtotime('31-Mar-2013 America/Los_Angeles'))."<br>"; # returns 1

夏令时之间的切换应在 2013 年 3 月 9 日至 2013 年 3 月 10 日之间。

此时问题来了,为什么我的PHP代码没有返回1。

【问题讨论】:

  • 这里返回一个1。你在用 PHP5 吗?
  • PHP 5.4.7 (xampp)。出于某种原因,即使设置了 America/Los_Angeles,它也会为我返回 0。我在 linux 和 windows 机器上试过这个。
  • @Jevgeni Bogatyrjov:strtotime() 不会更改服务器的时区设置,并且生成的时间戳不会存储任何 TZ 信息。

标签: php date strtotime


【解决方案1】:

您不能使用 strtotime,因为它会创建一个 UTC 时间戳,从而删除时区信息。相反,只需使用DateTime

$date = new DateTime('30-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1

$date = new DateTime('31-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1

$date = new DateTime('09-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0

$date = new DateTime('10-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0

注意到最后一个 DST 仍然为 0 吗?那是因为转换发生在凌晨 2:00:

$date = new DateTime('10-Mar-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 0

$date = new DateTime('10-Mar-2013 02:00 America/Los_Angeles');
echo $date->format('I');
# 1

这是一个“弹簧向前”的过渡,时钟从 2:00 跳到 3:00。

注意后备转换期间的歧义,时钟从 2:00 跳回 1:00

$date = new DateTime('3-Nov-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 1

有两个 1:00 AM,这是第一个。它是模棱两可的,因为我们可能指的是第二个,而没有表示出来。

有人会认为 PHP 将允许以下任一项:

new DateTime('3-Nov-2013 01:00 -0700 America/Los_Angeles')  #PDT
new DateTime('3-Nov-2013 01:00 -0800 America/Los_Angeles')  #PST

但是当我测试时这些似乎不起作用。我还尝试了 ISO 格式日期。任何人都知道如何正确区分 PHP 中的模棱两可的值?如果是这样,请在 cmets 中编辑或更新。谢谢。

【讨论】:

    【解决方案2】:

    注意后备转换期间的歧义,即时钟从 2:00 跳回 1:00 $date = new DateTime('3-Nov-2013 02:01 America/Los_Angeles');

    echo $date-&gt;format('I');

    0

    有两个 1:00 AM,2:01 是第二个 1 点钟加上 1 小时 1 分钟。

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 2010-09-27
      • 2014-01-25
      • 2012-12-21
      • 1970-01-01
      • 2012-04-07
      • 2012-06-06
      • 2023-04-05
      相关资源
      最近更新 更多