将 Epoch 转换为 EST,相差一个小时?

Converting Epoch to EST, off by an hour?

提问人:DDulla 提问时间:9/5/2023 最后编辑:ADysonDDulla 更新时间:9/6/2023 访问量:37

问:

我正在尝试将一个纪元转换为对人类友好的日期时间。我休息了 1 小时。为什么?

$aptTime = 1694194200;
if(!empty($aptTime)) {
        $aptDisplay = new dateTime("@$aptTime");
        $aptDisplay->setTimezone(new DateTimeZone('EST'));
        $aptStr = date_format($aptDisplay, "l F jS \a\\t g:i A");
        $html = '<p class="feature-box-desc text-dark" id="apt"><strong>' . $aptStr . '</strong></p>';      
    }

预计输出: 星期五 9 月 8 日下午 1:30

生成输出:9 月 8 日星期五中午 12:30

php datetime timezone 纪元

评论

3赞 Barmar 9/5/2023
你知道我们目前处于EDT,而不是EST,对吧?因此,美国东部时间距离时钟还有 1 小时,直到我们在 11 月回落。
3赞 Barmar 9/5/2023
通常最好使用在标准时间和夏令时之间自动调整的时区,而不是显式指定其中一个。例如 .US/Eastern
2赞 Sammitch 9/6/2023
“EST/EDT”也不是指代美国东海岸的全球标准。使用或定义一个位置,例如 .3v4l.org/RdW5CUS/EasternAmerica/New_York

答:

0赞 stefan_aus_hannover 9/5/2023 #1

如果您不想确认夏令时

这将为您提供所需的输出

$aptDisplay->setTimezone(new DateTimeZone('Etc/GMT+4'));

或者,如果您确认 DST,那么您的解决方案是准确的。

2赞 Álvaro González 9/6/2023 #2

1694194200 是 2023 年 9 月 8 日星期五 17:30:00 UTC 根据 Epoch Converter。PHP 同意:

date_default_timezone_set('UTC');
echo date('r', 1694194200);

2023 年 9 月 8 日星期五 17:30:00 +0000

EST代表东部标准时间,即UTC−05:00。因此,预期的本地时间正是您得到的 12:30。

我假设您期望 13:30,因为您的时钟设置为东部标准时间,这就是它显示的时间。问题是您的时钟实际上设置为东部夏令时 (EDT),即 UTC−04:00。

在 3 月的第二个星期日,美国东部时间凌晨 2:00,时钟提前到美国东部时间凌晨 3:00,留出一小时的间隔。在 11 月的第一个星期日,美国东部时间凌晨 2:00,时钟将移回美国东部时间凌晨 1:00,这会导致重复一小时。然而,巴拿马和加勒比地区的南部地区不遵守夏令时。

根本原因是夏令时的工作原理是将受影响的地区实际切换到不同的时区,每年两次。因此,使用这些固定时区根本没有用。相反,我建议您设置地理标识符,这些标识符在一年中不会更改,并且由跟踪 UTC 偏移量变化的数据库提供支持:

$aptTime = 1694194200;
$aptDisplay = new dateTime("@$aptTime");
$aptDisplay->setTimezone(new DateTimeZone('America/New_York'));
echo $aptDisplay->format('r');

2023年9月08日 星期五 13:30:00 -0400

将 New York 替换为适当的主要城市。