首页 文章

时区和夏令时问题

提问于
浏览
2

我已经查看了SO上的其他解决方案,他们似乎都没有在以下方面解决时区/ dst问题 .

我正在调用NOAA Tide Prediction APINOAA National Weather Service API,这需要传递一个时间范围来检索数据 . 对于我的数据库中的每个位置,我将时区作为UTC偏移量以及是否观察到夏令时(1或0) . 我'm trying to format some dates (todays and tomorrow) to be what the LST (Local Standard Time) would be in it'自己的时区所以我可以传递给这些API .

我无法弄清楚如何知道日期(例如今天)是否在夏令时范围内 .

这是我到目前为止:

// Get name of timezone for tide station
// NOTE: $locationdata->timezone is something like "-5"
$tz_name = timezone_name_from_abbr("", $locationdata->timezone * 3600, false);
$dtz = new DateTimeZone($tz_name);    

// Create time range
$start_time = new DateTime('', $dtz);
$end_time = new DateTime('', $dtz);
$end_time = $end_time->modify('+1 day');

// Modify time to match local timezone
$start_time->setTimezone($dtz);
$end_time->setTimezone($dtz);

// Adjust for daylight savings time
if( $locationdata->dst == '1' )
{
   // DST is observed in this area. 

   // ** HOW DO I KNOW IF TODAY IS CURRENTLY DST OR NOT? **  

}           

// Make call to API using modified time range
...

我该怎么做呢?谢谢 .

3 回答

  • 3

    您可以使用PHP的时间和日期函数:

    $tzObj = timezone_open($tz_name);
    $dateObj = date_create("07.03.2012 10:10:10", $tzObj);
    
    $dst_active = date_format($dateObj, "I");
    

    如果DST在给定日期处于活动状态,则 $dst_active1 ,否则为 0 .

    您也可以通过 "now" 来接收当前日期和时间的值,而不是在 date_create 的调用中指定时间 .

    但是,如同乔恩所提到的,同一时区内的不同国家可以观察到夏令时,而其他国家可能没有 .

  • 1

    对于我的数据库中的每个位置,我将时区作为UTC偏移量以及是否观察到夏令时(1或0) .

    这还不够信息 . 可以有多个时区都具有相同的标准偏移,都观察到DST,但是在不同时间执行DST转换 . (事实上,从历史上看,他们也可能会开始和停止观察夏令时数年 . )

    基本上,您的数据库应包含时区ID,而不是offset / DST-true-or-false . (假设PHP使用zoneinfo时区数据库,则时区ID类似于"Europe/London" . )

    编辑:要查找给定 DateTime 的偏移量,可以调用getOffset,然后可以将其与标准时间偏移进行比较 . 但除非您拥有明确的时区ID,否则您将面临错误区域的风险 .

  • 0

    Cillosis,我希望你不用Java!我和时间一直在战斗 . 我也使用天气数据 . 我使用的大部分数据都是在本地标准时间内(忽略夏令时) . 我还需要使用其他时区的时间,发现Java一直在读取计算机的时区 . 我也一直在运行已弃用的课程 . 我提出了一个有效的解决方案 . 它有点像kluge,所以我有大量记录,它只存在于一个函数中 . 我的解决方案是相对时间 . 我已将当地时间设置为UTC . 我正在减去GMT偏移而不是添加它 . 我真的不关心实际的时间,我关心的是两次之间的区别 . 它工作得很好 . 祝好运

相关问题