数据 1990-03-25 和亚洲/尼科西亚
有些奇怪IntlDateFormatter->parse
提供 false
PHP 5.6.11-1 + deb.sury.org~utopic + 1 INTL-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
答案 0 :(得分:2)
修改强>:
所以这与跳转到夏令时有关。 1990年3月25日是DST开始的时候,3月25日的午夜实际上是不存在的。尼科西亚在1998年改为欧盟关于夏令时变化的规定(凌晨3点凌晨1小时DST,凌晨4点-1小时返回非DST)。
这意味着您要么必须在该日期使用'1990-03-25 01',要么将解析器设置为非严格以自动克服此问题。
OR,只需使用DateTime的解析器而不是Intl来进行简单的数字输出。
原始回答
出于某种原因,似乎认为1990-03-25与您提供的格式化程序不匹配。设置$intlDateFormatter->setLenient(true);
允许它解析该格式。我注意到你已经将它设置为在顶部显式为假,记住。
如果没有宽松设置,格式化程序给出的错误(使用getErrorCode
和getErrorMessage
检查)是“解析失败的日期:U_PARSE_ERROR” - 表示它不认为格式与提供的字符串匹配。 parse()
中的第二个参数可用于查看在尝试解析日期时退出的字符。在这种情况下,它会退出第一个角色。
虽然这并没有给出关于为什么它认为模式不匹配的可靠答案,但它至少可以为您提供一些可能出现问题的基本方向。我会考虑将此作为PHP的错误,并查看响应是什么。