在PHP中,你可以告诉我们,如果一个给定的日期是在使用像这样的夏令时间段:
$isDST = date("I", $myDate); // 1 or 0
问题是,这只是告诉你的时刻,一个点是否在DST。 有没有检查DST是否有效在该时区的任何时间一个可靠的方式吗?
编辑澄清:
- 布里斯班,澳大利亚不会在任何一年的时间观察夏令时。 全年各地,它是GMT + 10。
- 澳大利亚悉尼的确,从10月到3月,当它GMT + 10〜GMT + 11的变化。
我想知道是否会有一些现有的方法,或者实现其工作方式这样的方法方式:
timezoneDoesDST('Australia/Brisbane'); // false
timezoneDoesDST('Australia/Sydney'); // true
我发现这些作品使用PHP的DateTimezone类(PHP 5.2+)的方法
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
$trans = $tz->getTransitions();
return ((count($trans) && $trans[count($trans) - 1]['ts'] > time()));
}
或者,如果你正在运行PHP 5.3+
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
return count($tz->getTransitions(time())) > 0;
}
在getTransitions()
功能让你每次约信息的偏移一个时区的变化。 这包括历史数据(布里斯曾在1916年夏令..谁知道?),所以此功能检查,如果有一个在未来或不偏移的变化。
其实nickf方法不适合我的工作,所以我重新设计了一点...
/**
* Finds wherever a TZ is experimenting dst or not
* @author hertzel Armengol <emudojo @ gmail.com>
* @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个月后返回true(三月),希望它有助于
DateTimeZone :: getTransitions可能的帮助。
你也许可以翼它:
$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1'));
否则,你需要解析基于文本的区信息的数据文件。
我不这么认为,但由于几乎每一个国家,观察DST改变其时间一整个赛季或两个,你可以尝试在任何一年中测试了4分。
例如,测试date("I", $date)
为2009/01/01,2009/04/01,2009/07/01和2009/10/01。 如果该时区分为DST,这些日期的则至少有一个会返回1。
日期必须是用户/服务器的时区,它的工作,并为您getTransitions你不能使用范围与日期
文章来源: How to tell if a timezone observes daylight saving at any time of the year?