在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()));
}

或者,如果您正在运行5.3+ php

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个月(3月)中返回True,希望它能有所帮助

DateTimeZone :: GetTransitions 可能有帮助。

您可能会翼:

$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1'));

否则您需要解析基于文本的 Zoneinfo 数据文件。

我不这么认为,但是由于观察到DST的几乎每个国家都会改变整个赛季的时间,因此您可以在任何给定年份尝试测试4分。

例如,测试 date("I", $date) 2009/01/01、2009/04/01、2009/07/01和2009/10/01。如果那个时区属于DST,那么其中至少一个日期将返回1。

日期必须在用户/服务器时区中才能正常工作,并且您不能像getTransitions一样使用日期范围

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top