PHP IntlDateFormatter无法按预期工作

时间:2019-08-18 11:30:20

标签: php symfony

代码非常简单,我想使用IntlDateFormatter将字符串转换为DateTime对象,但是结果与原始代码完全不同。我做错了什么?以下代码是根据DateTimeToLocalizedStringTransformer的{​​{1}}

构建的
Symfony4.3

2 个答案:

答案 0 :(得分:2)

IntlDateFormatter的日期格式错误,您需要使用ICU formats

最好使用常量而不是整数。

$dateStr = '2019-09-18 18:58:08';
$t = new \IntlDateFormatter('en_US', IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Asia/Shanghai' ,IntlDateFormatter::GREGORIAN, 'yyyy-MM-dd HH:mm:ss'); 
$t->setLenient(false);
$timestamp = $t->parse($dateStr);

//turn timestamp back to string
$dateStrFromTs = date_create(null,new \DateTimeZone('Asia/Shanghai'))
  ->setTimestamp($timestamp)
  ->format('Y-m-d H:i:s')
;

var_dump($dateStrFromTs === $dateStr);  //bool(true)

答案 1 :(得分:2)

首先,让我们摆脱魔术数字和间接检查,以确保:

$t = new \IntlDateFormatter(
    'en_US',
    IntlDateFormatter::MEDIUM,
    IntlDateFormatter::MEDIUM,
    new DateTimeZone('Asia/Shanghai'),
    IntlDateFormatter::GREGORIAN,
    'Y-m-d H:i:s');
$t->setLenient(false);
$timestamp = $t->parse('2019-09-18 18:58:08');
var_dump(date('r', $timestamp));

prints Fri, 18 Jan 2019 11:09:00 +0100。那怎么了?

问题是最后一个constructor parameter。您理所当然地认为格式代码与例如date(),但这不是文档所说的:

  

格式化或解析时要使用的可选模式。可能的模式记录在»http://userguide.icu-project.org/formatparse/datetime

  • Y表示“一年中的一周”年份
  • m表示每小时分钟

...等等。