检查夏令时是不是生效
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 库,这让您可以轻而易举地进行日期时间计算。
【讨论】:
以上是关于检查夏令时是不是生效的主要内容,如果未能解决你的问题,请参考以下文章