首页 > 解决方案 > php IntlDateFormatter 无法按预期工作

问题描述

代码非常简单,我想使用 IntlDateFormatter 将字符串转换为 DateTime 对象,但是结果与原始结果完全不同。我做错了什么?DateTimeToLocalizedStringTransformer以下代码是基于Symfony4.3

<?php

//turn string to timestamp
$t = new \IntlDateFormatter('en_US', 2, 2, new DateTimeZone('Asia/Shanghai') , 1, 'Y-m-d H:i:s');
$t->setLenient(false);
$timestamp = $t->parse('2019-09-18 18:58:08');

//turn timestamp back to string
$date = new DateTime();
$date->setTimestamp($timestamp);
$date->setTimezone(new \DateTimeZone('Asia/Shanghai'));

echo $date->format('Y-m-d H:i:s') . "\n"; //output : 2019-01-18 18:09:00, why? 

标签: phpsymfony

解决方案


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

使用常量而不是整数也更好。

$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)

推荐阅读