php IntlDateFormatter不';I don’我没有按预期工作

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

代码非常简单,我想使用IntlDateFormatter将字符串转换为DateTime对象,但是结果与原始结果完全不同。我做错了什么?以下代码基于
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')@没错。这只是一个快速诊断,以再次检查主要问题(完全错误的月份、分钟和秒),这显然不是一个简单的时区问题。尽管如此,也没有混淆,因为它打印出了时区。