php IntlDateFormatter不';I don’我没有按预期工作
代码非常简单,我想使用IntlDateFormatter将字符串转换为DateTime对象,但是结果与原始结果完全不同。我做错了什么?以下代码基于php IntlDateFormatter不';I don’我没有按预期工作,php,symfony,Php,Symfony,代码非常简单,我想使用IntlDateFormatter将字符串转换为DateTime对象,但是结果与原始结果完全不同。我做错了什么?以下代码基于Symfony4.3DateTimeToLocalizedStringTransformer的 <?php //turn string to timestamp $t = new \IntlDateFormatter('en_US', 2, 2, new DateTimeZone('Asia/Shanghai') , 1, 'Y-m-d H:i
Symfony4.3
DateTimeToLocalizedStringTransformer的
<?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?
IntlDateFormatter的日期格式错误,您需要
最好使用常量而不是整数
$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)
IntlDateFormatter的日期格式不正确,您需要
最好使用常量而不是整数
$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)
首先,让我们摆脱幻数和环境检查,只是为了确保:
$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));
此2019年1月18日星期五11:09:00+0100
。那么,怎么回事
问题是最后一个。您想当然地认为格式代码与中的相同,例如date()
,但这不是文档中所说的:
格式化或解析时使用的可选模式。可能的模式记录在»
Y
表示“一年中的一周”的年份
m
表示以小时为单位的分钟
。。。依此类推。首先,让我们摆脱幻数和环境检查,只是为了确保:
$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));
此2019年1月18日星期五11:09:00+0100
。那么,怎么回事
问题是最后一个。您想当然地认为格式代码与中的相同,例如date()
,但这不是文档中所说的:
格式化或解析时使用的可选模式。可能的模式记录在»
Y
表示“一年中的一周”的年份
m
表示以小时为单位的分钟
。。。等等。var_dump(日期('r',$timestamp));返回带有服务器默认时区的时间。要获得正确的时间,您必须首先设置日期\默认\时区\设置('Asia/Shanghai')@没错。这只是一个快速诊断,以再次检查主要问题(完全错误的月份、分钟和秒),这显然不是一个简单的时区问题。尽管如此,也没有什么混淆,因为它打印的是时区。var_dump(date('r',$timestamp));返回带有服务器默认时区的时间。要获得正确的时间,您必须首先设置日期\默认\时区\设置('Asia/Shanghai')@没错。这只是一个快速诊断,以再次检查主要问题(完全错误的月份、分钟和秒),这显然不是一个简单的时区问题。尽管如此,也没有混淆,因为它打印出了时区。