Почему мой IntlDateFormatter форматирует не тот день? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь отформатировать дату из прошлого, но, видимо, не могу этого сделать.

Проблема в том, что дата не просто отключается на несколько часов (что может быть из-за разных часовых поясов), но вместо этого он отключен на 5 дней .

Это мой пример кода:

<?php

$locale = "de";
$intlTimezone = \IntlTimeZone::createDefault();
$dateTimezone = $intlTimezone->toDateTimeZone();
$calendar = new \IntlGregorianCalendar($intlTimezone, $locale);
$dateFormatter = \IntlDateFormatter::create($locale, 2, -1, $intlTimezone, $calendar, "dd.MM.y");

$time = DateTimeImmutable::createFromFormat("Y-m-d", "978-12-27", $dateTimezone);
var_dump($time);
var_dump($time->format("d.m.Y"));
var_dump($dateFormatter->format($time));

Вы можете увидеть его на 3v4l.org здесь: https://3v4l.org/tXVgn

Это вывод:

object(DateTimeImmutable)#5 (3) {
    ["date"]=>
    string(26) "0978-12-27 14:31:03.000000"
    ["timezone_type"]=>
    int(2)
    ["timezone"]=>
    string(3) "CET"
}
string(10) "27.12.0978"
string(9) "22.12.978"

Последнее значение кажется неправильным.Также обратите внимание, что PHP <= 7.0.33 не может отформатировать его и возвращает <code>false.

1 Ответ

0 голосов
/ 14 декабря 2018

Кажется, что функция createFromFormat использует галактический календарь , который применяет календарь, который мы используем в настоящее время, к старым датам.Формат даты, кажется, использует юлианский календарь, который был фактически использован.Для 978 разница между ними составляет 5 дней.

Странно, я не нахожу ничего в документации, которая указала бы, какой календарь используется, какой класс или какая дата считается отрезанной между двумя календарными системами.

...