【问题标题】:Why is my IntlDateFormatter formatting the wrong day?为什么我的 IntlDateFormatter 格式错误?
【发布时间】:2019-05-15 18:56:20
【问题描述】:

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

问题是,日期不只是相差几个小时(这可能是由于不同的时区),而是相差 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 false。

【问题讨论】:

  • 对不起,如果这是重复的,但我已经搜索了问题,但我发现的只是简单的时区问题。
  • 我不确定它是否有帮助,但在 978 年,公历没有生效
  • 这实际上是一个非常好的观点,谢谢@FedericoklezCulloca 我想我们然后在这里进入“未定义”领域?
  • 但看起来 PHP 日期时间函数应该能够根据文档中的此注释处理它 日期和时间信息在内部存储为 64 位数字,因此所有这些都可能有用支持日期(包括负年份)。范围从过去约 2920 亿年到未来相同。

标签: php datetime intl


【解决方案1】:

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

奇怪的是,我在文档中找不到任何说明哪个日历由哪个班级使用或哪个日期被视为两个日历系统之间的截止日期。

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2019-11-23
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多