在PHP中,您可以使用以下内容判断给定日期是否在夏令时期间:
$isDST = date("I", $myDate); // 1 or 0
问题是,这只会告诉您这个时间点是否在DST中。是否有可靠的方法来检查DST是否在该时区的任何时间生效?
编辑以澄清:
我想知道是否会有一些现有的方法,或者一种实现方法的方法:
timezoneDoesDST('Australia/Brisbane'); // false
timezoneDoesDST('Australia/Sydney'); // true
答案 0 :(得分:14)
我找到了一个使用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年有夏令时......谁知道?),所以这个函数检查未来是否有偏移变化。
答案 1 :(得分:10)
实际上,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个月(3月)返回true,希望它有所帮助
答案 2 :(得分:3)
DateTimeZone::getTransitions可能会有所帮助。
你可能会躲开它:
$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1'));
否则,您需要解析基于文本的zoneinfo数据文件。
答案 3 :(得分:0)
我不这么认为,但由于几乎每个观察夏令时的国家都会改变整整一个赛季的时间,你可以尝试在任何一年中测试4分。
例如,在2009/01 / 01,2009 / 04 / 01,2009 / 07/01和2009/10/01测试date("I", $date)
。如果该时区属于DST,那么这些日期中至少有一个将返回1.
答案 4 :(得分:0)
日期必须位于用户/服务器时区才能生效,并且您不能像使用getTransitions那样使用带日期的范围