检查DST是否生效

时间:2013-12-06 07:06:14

标签: php datetime offset dst gmt

在PHP中,date('I')会告诉我夏令时是否有效。这是否告诉我DST是否专门用于我服务器配置的时区,或者它是否有效期?

我在亚利桑那州,我们没有观察夏令时。所以我需要我的服务器才能认识到,比如纽约现在提前2个小时,但是当DST在明年3月开始时,它比我提前3个小时。

更新

鉴于评论是我的服务器配置的时区,我如何确定我的服务器时区与某个任意时区之间的当前时差,知道该值在一年中会发生变化?

3 个答案:

答案 0 :(得分:3)

PHP将遵守服务器的默认时区,因此如果您的服务器配置正确,则日期('I')将始终在亚利桑那州返回false。

您可以暂时将默认时区更改为观察夏令时的区域。要更改默认时区,请使用date_default_timezone_set()所示的here

答案 1 :(得分:0)

这是我的操作方式:

SELECT idProj, idStep
FROM table t
WHERE t.idStep = (SELECT max(idStep)
                  FROM table t2
                  WHERE t2.idProj = t.idProj
                 );

答案 2 :(得分:0)

您不必更改服务器时区并确定 DST 当前是否有效。这是一个简单的方法:

function isDst($timezone) {
    $date = new DateTime('now', new DateTimeZone($timezone));
    return (bool) $date->format('I');
}
// isDst(date_default_timezone_get()) for server timezone
// isDst('America/Los_Angeles')

要确定两个时区之间的时差:

function getTimezoneDiff($tz1, $tz2) {
    $date1 = new DateTime('today', new DateTimeZone($tz1));
    $date2 = new DateTime('today', new DateTimeZone($tz2));

    // Get the difference in seconds
    $secondsDiff = $date2->getTimestamp() - $date1->getTimestamp();

    // Some magic to format the time difference
    $timeDiff = gmdate('H:i:s', abs($secondsDiff));
    return (($secondsDiff > 0) ? '' : '-') . $timeDiff;
}
// getTimezoneDiff('America/Los_Angeles', 'Asia/Kolkata') ==> '-12:30:30'

注意:负返回值表示 $tz1 落后于 $tz2

如果您的应用中有大量日期时间操作,您可以使用 Carbon 库,这样可以轻而易举地进行日期时间计算。