检查夏令时是否生效

4
在PHP中,date('I')将告诉我是否启用了夏令时。这是否告诉我夏令时是否特别适用于我的服务器配置的时区,还是无论如何都适用?
我在亚利桑那州,我们不遵守夏令时。因此,我需要我的服务器认识到,比如纽约现在比我早2个小时,但是明年3月夏令时开始后,就比我早3个小时。
更新:
考虑到评论是针对我的服务器配置的时区,那么我该如何确定当前时差在我的服务器时区和任意时区之间,知道这个值会在一年中改变?

1
这是针对您服务器配置的时区。 - Paul Dessert
http://stackoverflow.com/questions/11031943/can-i-test-for-daylight-saving-time-dst-using-php-date - Nouphal.M
3个回答

5

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

您可以暂时更改默认时区为观察夏令时的地区。要更改默认时区,请按照这里所示使用date_default_timezone_set()函数。


你是否认为,即使它听起来有些不太正式,最好的方法是将我的时区设置为遵守DST的一个时区,使用 date('I')来获取DST是否生效,然后将时区设置回原来的位置? - Nick Coons
好的。至于您的后续问题,您可以比较调用date_default_timezone_set()之前和之后的date('Z') -与UTC偏移量的秒数-的输出,以获取当前差异的秒数。 - Tom McClure
我的目标是找出我所在时区和任意其他时区之间的时间差异。最终我做的是捕获我的时区,然后将时区设置为“America/Los_Angeles”,运行date('I')来查看是否启用夏令时,然后切换回我的时区。这最终解决了我的问题。谢谢! - Nick Coons
谢谢!对我来说,很明显我需要指定相关的时区。 - user1893702

3

我是这样做的:

// Determine if DST is currently in effect
function isDST(): bool
{
    $server_timezone = date_default_timezone_get();
    // Set the timezone to one we know observes DST because date() uses the server timezone
    date_default_timezone_set('America/New_York');
    $is_dst = date('I');
    // reset server timezone
    date_default_timezone_set($server_timezone);

    return $is_dst;
}

1

您不需要更改服务器时区并确定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库,它使得进行日期时间计算变得非常轻松。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接