PHP - using date to find out daylight savings time

丶灬走出姿态 提交于 2019-11-28 01:21:32

问题


I want to give date() a date and have it return if that date is DST or not. Running PHP 5.4.7 via xampp on a windows 7 box. A linux box running PHP 5.2.8 returns 0 no matter what date I give it.

What's wrong with my code?

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

The switch between DST should be between 9-Mar-2013 - 10-Mar-2013.

At this point, the question is, why doesn't my PHP code return 1.


回答1:


You can't use strtotime because it creates a UTC timestamp, which removes the timezone information. Instead, just use 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

Notice that the DST is still 0 on that last one? That's because the transition happens at 2:00 AM:

$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

This is a "spring-forward" transition, where the clock jumps from 2:00 to 3:00.

Beware of ambiguity during fall-back transitions, where the clock jumps from 2:00 back to 1:00

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

There are two 1:00 AMs, and this is taking the first one. It is ambiguous, because we might have meant the second one, and that is not represented.

One would think that PHP would allow either of the following:

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

But these don't seem to work when I tested. I also tried ISO format dates. Anyone know how to properly distinguish ambiguous values in PHP? If so, please edit or update in comments. Thanks.




回答2:


Beware of ambiguity during fall-back transitions, where the clock jumps from 2:00 back to 1:00 $date = new DateTime('3-Nov-2013 02:01 America/Los_Angeles');

echo $date->format('I');

0

There are two 1:00 AMs, and 2:01 is taking the second one o'clock plus 1 hour and 1 minute.



来源:https://stackoverflow.com/questions/16288185/php-using-date-to-find-out-daylight-savings-time

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!