DateTime() 和 IntlDateFormatter 转换时区时的时间不同

DateTime() and IntlDateFormatter diffrent hours when convert timezone

提问人:Dev devovs 提问时间:10/28/2023 最后编辑:Dev devovs 更新时间:11/4/2023 访问量:36

问:

例:

$date = new DateTime('2023-09-08 06:00:00.0', new DateTimeZone('UTC')); // USER's timezone

echo $date->format('Y-m-d H:i:s');

$formatter = new IntlDateFormatter(
    'en', 
    IntlDateFormatter::SHORT, 
    IntlDateFormatter::SHORT, 
    'CST', 
    IntlDateFormatter::GREGORIAN,
    'YYYY-MM-dd HH:mm'
);
echo '</br>';
echo $formatter->format($date );

echo '</br>';
$date->setTimezone(new DateTimeZone('CST'));
echo $date->format('Y-m-d H:i:s');

输出:

2023-09-08 06:00:00

2023-09-08 01:00

2023-09-08 00:00:00

为什么结果不同,哪一个是正确的?

日期时间 php-8.1 intldateformatter

评论

1赞 Barmar 10/28/2023
您在代码中回显了 3 次日期,为什么输出中只有 2 个日期?
0赞 aynber 10/28/2023
两者都是正确的。CST 是 -6,但当前时区是 CDT(直到 11 月 5 日),即 -5。
0赞 Dev devovs 10/28/2023
@aynber DateTime 不知道如何确定夏令时?
3赞 aynber 10/28/2023
如果您使用位置时区而不是 CDT/CST,则会这样,CDT/CST 指定了确切的偏移量。所以试试,它稳固地位于美国中部时区。America/Chicago
1赞 aynber 10/28/2023
我强烈建议阅读 php.net/manual/en/timezones.others.php 顶部的注释

答:

1赞 TSCAmerica.com 11/4/2023 #1

在提供给 的模式中,您使用的是表示“周年”的“”。您应该使用“”来表示日历年。IntlDateFormatterYYYYyyyy

$date = new DateTime('2023-09-08 06:00:00.0', new DateTimeZone('UTC')); // USER's timezone

echo $date->format('Y-m-d H:i:s');

$formatter = new IntlDateFormatter(
    'en', 
    IntlDateFormatter::SHORT, 
    IntlDateFormatter::SHORT, 
    'America/Chicago', // Use a full time zone identifier
    IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd HH:mm' // Use 'yyyy' instead of 'YYYY'
);
echo '</br>';
echo $formatter->format($date );

echo '</br>';
$date->setTimezone(new DateTimeZone('America/Chicago')); 
echo $date->format('Y-m-d H:i:s');