时区和夏令时问题

我已经浏览了SO上的其他解决方案,并且它们都没有涉及以下方面的时区/ dst问题。

我正在呼叫NOAA潮汐预测API和NOAA国家气象服务API,这些API需要通过检索数据的时间范围。 对于我的数据库中的每个位置,我都将UTC的时区作为UTC偏移量,以及是否观察到夏令时(1或0)。 我试图将某些日期(今天和明天)格式化为LST(本地标准时间)在它自己的时区中,因此我可以传递给这些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
...

我怎么能这样做呢? 谢谢。


您可以使用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中指定时间。

然而,像乔恩所说的,同一时区内的不同国家可能会观察到DST,而其他国家则可能不会。


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

这不是足够的信息。 可以有多个时区都具有相同的标准偏移量,都观察DST,但在不同的时间执行DST转换。 (的确,历史上他们可能会开始和停止几年的夏令时。)

基本上,你的数据库应该包含一个时区ID,而不是偏移量/ DST-true-or-false。 (假设PHP使用zoneinfo时区数据库,时区ID就像是“Europe / London”。)

编辑:要找到给定的DateTime时间的偏移量,您可以调用getOffset ,然后您可以与标准时间偏移进行比较。 但是除非你有明确的时区ID,否则你将冒着弄错区域的风险。


Cillosis,我希望你没有使用Java! 我一直在与时间战斗。 我也与天气数据一起工作。 我使用的大部分数据都在本地标准时间(忽略夏令时)。 我还需要使用其他时区的时间,并发现Java一直在阅读我电脑的时区。 我还不断遇到弃用的课程。 我想出了一个可行的解决方案。 这有点难听,所以我有很多文档记录,它只存在于一个函数中。 我的解决方案是相对时间。 我已将当地时间设置为UTC。 我正在减去GMT偏移量而不是添加它。 我并不在意实际的时间,我只关心两次之间的差异。 它工作得很好。 祝你好运

链接地址: http://www.djcxy.com/p/29357.html

上一篇: Timezone and Daylight Savings Issues

下一篇: How to tell if a timezone observes daylight saving at any time of the year?