IntlDateFormatter 解析不适​​用于特定参数

IntlDateFormatter parse doesn't work with specific params

有些奇怪的数据 1990-03-25Asia/Nicosia

IntlDateFormatter->parse

给出 false

PHP 5.6.11-1+deb.sury.org~乌托邦+1 国际-3.0.0

<?php
$intlDateFormatter = new IntlDateFormatter(
    'en_US',
    2,
    -1,
    'Asia/Nicosia',
    1,
    'yyyy-MM-dd'
);
$intlDateFormatter->setLenient(false);

$date = '1990-03-24';
$res = $intlDateFormatter->parse($date);
echo "$date - $res\n"; // 1990-03-24 - 638229600

$date = '1990-03-25';
$res = $intlDateFormatter->parse($date);
echo "$date - $res\n"; // 1990-03-25 - 

$date = '1990-03-26';
$res = $intlDateFormatter->parse($date);
echo "$date - $res\n"; // 1990-03-26 - 638398800

编辑:

所以这与跳转到夏令时有关。 1990 年 3 月 25 日是 DST 生效的时间,因此 3 月 25 日午夜实际上是不存在的。尼科西亚在 1998 年更改为欧盟关于夏令时更改的规则(夏令时凌晨 3 点+1 小时,凌晨 4 点-1 小时返回非夏令时)。

这意味着您要么必须为该日期使用“1990-03-25 01”,要么将解析器设置为非严格以自动解决此问题。

或者,只需使用 DateTime 的解析器而不是 Intl 来进行简单的数字输出。


原回答

出于某种原因,它似乎认为 1990-03-25 与您提供的格式化程序不匹配。设置 $intlDateFormatter->setLenient(true); 允许它解析该格式。请注意,我确实注意到您已在顶部将其明确设置为 false。

没有宽松的设置,格式化程序给出的错误(用 getErrorCodegetErrorMessage 检查)是 "Date parsing failed: U_PARSE_ERROR" - 表明它认为格式不匹配提供的字符串. parse() 中的第二个参数可用于查看在尝试解析日期时退出的字符。在这种情况下,它会在第一个字符处退出。

虽然这并没有给你一个关于为什么它认为模式不匹配的可靠答案,但它至少给了你一些基本的方向,说明可能是什么问题。我会考虑将此作为错误提交给 PHP,然后看看响应是什么。