Timezone and Daylight Savings Issues
我已经查看了SO上的其他解决方案,他们似乎都没有在以下方面解决时区/ dst问题。
我正在调用NOAA Tide Prediction API和NOAA国家气象服务API,要求通过时间范围来检索数据。 对于我的数据库中的每个位置,我将时区作为UTC偏移量以及是否观察到夏令时(1或0)。 我正在尝试将某些日期(今天和明天)格式化为LST(本地标准时间)将在其自己的时区中,因此我可以传递给这些API。
我无法弄清楚如何知道日期(例如今天)是否在夏令时范围内。
这是我到目前为止:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // 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 ... |
我该怎么做呢? 谢谢。
您可以使用PHP的时间和日期函数:
1 2 3 4 | $tzObj = timezone_open($tz_name); $dateObj = date_create("07.03.2012 10:10:10", $tzObj); $dst_active = date_format($dateObj,"I"); |
如果DST在给定日期处于活动状态,则
您可以传递
但是,如同乔恩所提到的,同一时区内的不同国家可以观察到夏令时,而其他国家可能没有。
For each location in my database, I have the timezone as a UTC offset and whether daylight savings time is observed (either 1 or 0).
这还不够信息。可以有多个时区都具有相同的标准偏移,都观察到DST,但是在不同时间执行DST转换。 (事实上??,从历史上看,他们也可能会开始和停止观察夏令时数年。)
基本上,您的数据库应包含时区ID,而不是offset / DST-true-or-false。 (假设PHP使用zoneinfo时区数据库,则时区ID类似于"Europe / London"。)
编辑:要查找给定
Cillosis,
我希望你不使用Java!我和时间一直在战斗。我也使用天气数据。我使用的大部分数据都是在本地标准时间内(忽略夏令时)。我还需要使用其他时区的时间,发现Java一直在读取计算机的时区。我也一直在运行已弃用的课程。我提出了一个有效的解决方案。它有点像kluge,所以我有大量记录,它只存在于一个函数中。我的解决方案是相对时间。我已将当地时间设置为UTC。我正在减去GMT偏移而不是添加它。我真的不关心实际的时间,我关心的是两次之间的区别。它工作得很好。
祝好运