问题在于,在某些时区,例如凌晨2:00或凌晨2:59,在秋季会重复出现,而在春季的夏令时节约变化期间则不存在。
如果我运行一个PHP循环,通过整个年份的每一分钟,如何在循环中捕获DST时间节约小时?(在当前时区中,由date_default_timezone_set设置)
我该如何完成一个兼容PHP 5.2的函数,例如:
如果我运行一个PHP循环,通过整个年份的每一分钟,如何在循环中捕获DST时间节约小时?(在当前时区中,由date_default_timezone_set设置)
我该如何完成一个兼容PHP 5.2的函数,例如:
<?php
/** returns true if a time is skipped or doubled
* (for example "2013-03-10 02:30" doesen't exist in USA)
*
* @param string $season
* @param string $datestring in the form of "2013-03-10 02:30"
* @return boolean
**/
function checkDST($datestring,$season="any"){
$tz=date_default_timezone_get();
$season=strtolower(trim($season));
if($season=="spring"){
if(/* an hour skipped */) return true;
}else if($season=="autumn"){
if(/* double hour */) return true;
} else if($season=="any") {
if(/* any of both */) return true;
}
return false
}
所以我可以使用
date_default_timezone_set("America/New_York");
$is_skipped=checkDST("2013-03-10 02:30","spring");
和
$exists_two_times=checkDST(2003-11-03, 02:00,"autumn"); // or 2:59 for example
(时区请参见:http://www.timeanddate.com/worldclock/clockchange.html?n=224&year=2013)
编辑:
我发现如何检测春季夏令时:
function checkDST($datestring,$season="any"){
var_dump('checking '.$datestring);
$season=strtolower(trim($season));
$datestring=substr($datestring,0,16);
if($season!="autumn" and date("Y-m-d H:i",strtotime($datestring))!=$datestring) {
return true;
}
// check for double hours in autumn
...
date_default_timezone_set
。我还更改了检查的间隔为31分钟(而不是之前的小时),以便更精确地与您描述的30分钟间隔数组相关联。 - Jeff Sisson