【问题标题】:Timezone and Daylight Savings Issues时区和夏令时问题
【发布时间】:2012-03-25 06:49:20
【问题描述】:

我查看了关于 SO 的其他解决方案,但似乎没有一个解决以下方面的时区/夏令时问题。

我正在调用NOAA Tide Prediction APINOAA National Weather Service API,这需要传递时间范围来检索数据。对于我数据库中的每个位置,我将时区作为 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 date timezone dst


    【解决方案1】:

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

    但是,就像 Jon 提到的那样,同一时区偏移量内的不同国家可能会遵守 DST,而其他国家可能不会。

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 函数timezone_name_from_abbr("", $locationdata->timezone * 3600, false);从一个偏移量返回时区ID,所以-5可能会返回'America/New York`。
    • @cilosis:您是否依赖于准确的映射?因为它模棱两可。将编辑以回答具体问题...
    • 我确信会有歧义,但目前我并不担心。我更关心的是确定一个区域当前是否正在观察 DST。
    • @cilosis:嗯,如果你不知道你真正感兴趣的领域是很难知道的......但正如我所说,你可以在 DateTime 上致电getOffset 来查找出来。
    • 您可以使用 cron 作业使您的 tzdata(以及 DST)定义保持最新,以经常更新此 PECL 包:pecl.php.net/package/timezonedb
    【解决方案3】:

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

    【讨论】:

    • 我正在使用 PHP,最终实现了类似的解决方案。
    猜你喜欢
    • 2011-04-07
    • 2012-09-06
    • 1970-01-01
    • 2014-08-22
    • 2013-10-13
    • 1970-01-01
    • 2017-03-14
    • 2012-03-21
    • 2015-08-11
    相关资源
    最近更新 更多