【问题标题】:IntlDateFormatter parse doesn't work with specific paramsIntlDateFormatter 解析不适​​用于特定参数
【发布时间】:2015-12-12 19:23:45
【问题描述】:

1990-03-25Asia/Nicosia

的数据有些奇怪
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

【问题讨论】:

    标签: php intl


    【解决方案1】:

    编辑

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

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

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


    原答案

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

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

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

    【讨论】:

    • 非常感谢。我在这里遇到了这个问题 \Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer::getIntl​​DateFormatter 并更改了表单类型
    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多