一些奇怪的数据1990-03-25和Asia/尼科西亚
IntlDateFormatter->parse给出假
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发布于 2015-09-16 10:24:16
编辑
所以这和跳转到DST有关。1990年3月25日是DST启动的时候,所以3月25日的午夜实质上是不存在的。尼科西亚在1998年修改了欧盟关于DST变化的规则( DST在凌晨3点+1小时,返回非DST时在凌晨4点-1小时)。
这意味着您必须使用“1990-03-2501”作为该日期,或者将解析器设置为非严格的,以自动解决此问题。
或者,只对简单的数字输出使用DateTime的解析器而不是Intl。
原始答案
出于某种原因,它似乎认为1990-03-25不符合您提供的格式化程序。设置$intlDateFormatter->setLenient(true);允许它解析该格式。我确实注意到你把它设置为在顶部显式错误,注意。
如果没有宽大设置,格式化程序给出的错误(用getErrorCode和getErrorMessage检查)是“日期解析失败: U_PARSE_ERROR”--表示它认为格式与提供的字符串不匹配。parse()中的第二个参数可以用来查看它在试图解析日期时退出哪个字符。在这种情况下,它存在于第一个字符上。
虽然这不能给你一个确切的答案,为什么它认为模式不匹配,但它至少给你一些基本的方向,什么可能是问题。我会考虑将它作为一个bug提交给PHP,然后看看响应是什么。
https://stackoverflow.com/questions/32604670
复制相似问题