問題は、たとえば、一部のタイムゾーンでは午前 2:00 または午前 2:59 が秋に 2 倍になり、DST の時間節約の変更中に春には存在しないことです。
1 年を通して毎分 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 )
編集:
春のDSTを検出する方法を見つけました:
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
...