为什么我的IntlDateFormatter格式化错误的日期?

时间:2018-12-14 13:36:58

标签: php datetime intl

我正在尝试格式化过去的日期,但显然没有这样做。

问题在于,日期不仅仅会缩短几个小时(可能是由于不同的时区),而是会被推迟 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无法格式化它并返回false

1 个答案:

答案 0 :(得分:2)

createFromFormat函数似乎使用了prolectic Gregorian calendar,它将当前使用的日历应用于旧日期。日期格式似乎使用了实际使用的儒略历。对于978,两者之间的差值为5天。

奇怪的是,我在文档中找不到任何东西可以指定哪个日历由哪个类使用或哪个日期被认为是两个日历系统之间的截止日期。