代码非常简单,我想使用IntlDateFormatter将字符串转换为DateTime对象,但是结果与原始代码完全不同。我做错了什么?以下代码是根据DateTimeToLocalizedStringTransformer
的{{1}}
Symfony4.3
答案 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
表示每小时分钟。...等等。