IntlDateFormatter 解析不适用于特定参数
IntlDateFormatter parse doesn't work with specific params
有些奇怪的数据 1990-03-25 和 Asia/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。
没有宽松的设置,格式化程序给出的错误(用 getErrorCode
和 getErrorMessage
检查)是 "Date parsing failed: U_PARSE_ERROR" - 表明它认为格式不匹配提供的字符串. parse()
中的第二个参数可用于查看在尝试解析日期时退出的字符。在这种情况下,它会在第一个字符处退出。
虽然这并没有给你一个关于为什么它认为模式不匹配的可靠答案,但它至少给了你一些基本的方向,说明可能是什么问题。我会考虑将此作为错误提交给 PHP,然后看看响应是什么。
有些奇怪的数据 1990-03-25 和 Asia/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。
没有宽松的设置,格式化程序给出的错误(用 getErrorCode
和 getErrorMessage
检查)是 "Date parsing failed: U_PARSE_ERROR" - 表明它认为格式不匹配提供的字符串. parse()
中的第二个参数可用于查看在尝试解析日期时退出的字符。在这种情况下,它会在第一个字符处退出。
虽然这并没有给你一个关于为什么它认为模式不匹配的可靠答案,但它至少给了你一些基本的方向,说明可能是什么问题。我会考虑将此作为错误提交给 PHP,然后看看响应是什么。