How to tell if a timezone observes daylight saving at any time of the year?
在PHP中,您可以使用如下方法来判断给定日期是否在夏令时期间:
1 |
问题是,这只告诉您一个时间点是否在DST中。是否有可靠的方法来检查DST在该时区的任何时间是否有效?
编辑以澄清:
- 澳大利亚布里斯班每年的任何时候都不遵守夏令时。全年都是格林尼治标准时间+10。
- 澳大利亚的悉尼从10月到3月,从格林尼治标准时间+10改为格林尼治标准时间+11。
我想知道是否会有一些现有的方法,或者一种方法来实现这样的方法:
1 2 | timezoneDoesDST('Australia/Brisbane'); // false timezoneDoesDST('Australia/Sydney'); // true |
我找到了一个使用PHP的DateTimeZone类(php5.2+)工作的方法。
1 2 3 4 5 |
或者,如果运行的是php5.3+
1 2 3 4 |
实际上,nickf方法对我不起作用,所以我对它做了一些修改…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * Finds wherever a TZ is experimenting dst or not * @author hertzel Armengol * @params string TimeZone -> US/Pacific for example * */ function timezoneExhibitsDST($tzId) { $tz = new DateTimeZone($tzId); $date = new DateTime("now",$tz); $trans = $tz->getTransitions(); foreach ($trans as $k => $t) if ($t["ts"] > $date->format('U')) { return $trans[$k-1]['isdst']; } } // Usage var_dump(timezoneExhibitsDST("US/Pacific")); --> prints false var_dump(timezoneExhibitsDST("Europe/London")); --> prints false var_dump(timezoneExhibitsDST("America/Chicago")); --> prints false |
同一个函数调用将在1个月(3月)内返回true,希望它有帮助
DateTimeZone::GetTransitions可能会有所帮助。
你可能会振翅高飞:
否则,您需要解析基于文本的ZoneInfo数据文件。
日期必须在用户/服务器时区才能工作,并且不能像处理getTransitions那样使用日期范围。
我不这么认为,但由于几乎每个观察DST的国家都会改变一到两个赛季的时间,所以你可以尝试在任何一年内测试4分。
例如,2009/01/01、2009/04/01、2009/07/01和2009/10/01测试