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

时间:2015-09-16 09:28:40

标签: php intl

数据 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

1 个答案:

答案 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);允许它解析该格式。我注意到你已经将它设置为在顶部显式为假,记住。

如果没有宽松设置,格式化程序给出的错误(使用getErrorCodegetErrorMessage检查)是“解析失败的日期:U_PARSE_ERROR” - 表示它不认为格式与提供的字符串匹配。 parse()中的第二个参数可用于查看在尝试解析日期时退出的字符。在这种情况下,它会退出第一个角色。

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