gpt4 book ai didi

php - 为什么我使用 "IntlDateFormatter"时会有这个时间差?

转载 作者:搜寻专家 更新时间:2023-10-31 21:20:44 26 4
gpt4 key购买 nike

为什么我使用“IntlDateFormatter”时会有这个时间差?

<?php

// php v7.1

$pattern = 'yyyy-MM-dd HH:mm:ss';
$timezone = "Europe/Budapest";
$inputDateTimeStr = '1890-01-01 00:00:00';
$locale = 'hu_HU';

$intlDateFormatter = new \IntlDateFormatter( $locale, \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, \IntlTimeZone::createTimeZone($timezone), \IntlDateFormatter::GREGORIAN, $pattern
);

$dateTime = new \DateTime($inputDateTimeStr);
$dateTime->setTimezone(new \DateTimeZone($timezone));

$outputDateTimeStr = $intlDateFormatter->format($dateTime->getTimestamp());

print ' in: ' . $inputDateTimeStr
. ' out: ' . $outputDateTimeStr // string(19) "1890-01-01 00:16:20"
. ' diff: ' . ( strtotime($outputDateTimeStr) - strtotime($inputDateTimeStr) ) . ' seconds';

输出:输入:1890-01-01 00:00:00 输出:1890-01-01 00:16:20 差异:980 秒

最佳答案

我认为,intlDateFormatter 和 DateTime 在 1890 年之前是不兼容的。欧洲中部时间 (MET) 于 1890 年后逐步引入欧洲。1890 年初,每个地方都有自己的时间,具体取决于经度。以下代码显示了 4 个示例。

$refDate = date_create('1890-01-01 UTC');
$ts = $refDate->getTimeStamp();
$pattern = 'yyyy-MM-dd HH:mm:ss';
$timezones = [
"Europe/Paris", //2.3522° E
"Europe/Berlin", //13.4050° E
"Europe/Prague", //14.4378° E
"Europe/Budapest"//19.0402° E
];
$locale = 'hu_HU';

foreach($timezones as $timezone){
$intlDateFormatter = new \IntlDateFormatter(
$locale,
\IntlDateFormatter::MEDIUM,
\IntlDateFormatter::SHORT,
\IntlTimeZone::createTimeZone($timezone),
\IntlDateFormatter::GREGORIAN,
$pattern
);

$outputDateTimeStr = $intlDateFormatter->format($ts);
echo $timezone.": ".$outputDateTimeStr."<br>";
}

输出

Europe/Paris: 1890-01-01 00:09:21
Europe/Berlin: 1890-01-01 00:53:28
Europe/Prague: 1890-01-01 00:57:44
Europe/Budapest: 1890-01-01 01:16:20

DateTime 提供其他结果。

关于php - 为什么我使用 "IntlDateFormatter"时会有这个时间差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50151076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com