当我使用“IntlDateFormatter”时,为什么这个时间差异?

时间:2018-05-03 09:06:45

标签: php datetime datetime-format

当我使用“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';

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

1 个答案:

答案 0 :(得分:1)

我认为intlDateFormatter和DateTime在1890年之前不兼容。 1890年后,中欧时间(MET)被引入欧洲。 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提供其他结果。