检查夏令时是不是生效

Posted

技术标签:

【中文标题】检查夏令时是不是生效【英文标题】:Check if DST is in effect检查夏令时是否生效 【发布时间】:2013-12-23 11:03:05 【问题描述】:

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

我在亚利桑那州,我们不遵守夏令时。所以我需要我的服务器来识别,比如说,纽约现在比我早 2 小时,但是当明年 3 月 DST 开始时,它比我早 3 小时。

更新:

鉴于它是针对我的服务器配置的时区的评论,我将如何确定我的服务器时区和某个任意时区之间的当前时差,知道该值全年都在变化?

【问题讨论】:

适用于您服务器配置的时区。 ***.com/questions/11031943/… 【参考方案1】:

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

您可以暂时将默认时区更改为遵守 DST 的地区。要更改默认时区,请使用 date_default_timezone_set(),如 here 所示。

【讨论】:

所以你会说最好的方法,即使这听起来有点像黑客,将我的时区设置为一个遵守 DST 的时区,使用date('I') 来获取是否 DST生效,然后将时区设置回原来的位置? 对。至于您的后续问题,您可以比较 date('Z') 的输出 - 以秒为单位的 UTC 偏移量 - 在调用 date_default_timezone_set() 之前和之后,以获得以秒为单位的当前差异。 我的目标是找出我所在位置与任意其他时区之间的时间差异。我最终做的是捕获我的时区,然后将我的时区设置为“America/Los_Angeles”,运行date('I') 以查看是否启用了 DST,然后切换回我的时区。这最终为我解决了这个问题。谢谢! 谢谢!很明显,我需要指定相关的时区。【参考方案2】:

我是这样做的:

// 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;

【讨论】:

【参考方案3】:

您不必更改服务器时区并确定 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 库,这让您可以轻而易举地进行日期时间计算。

【讨论】:

以上是关于检查夏令时是不是生效的主要内容,如果未能解决你的问题,请参考以下文章

检查夏令时是否有效?

有没有办法检查它是不是是 UTC 的 DST(夏令时)?

如何检查 DST(夏令时)是不是有效,如果有效,偏移量?

在 Javascript 中使用夏令时检查日期范围

双重检查 PostgreSQL 服务器上的夏令时规则是最新的吗?

Linux下C语言恢复夏令时