php - IntlDateFormatter()与DateTime()输出相比时间戳错误/怪异

2ic8powd  于 2023-03-07  发布在  PHP
关注(0)|答案(1)|浏览(110)

我注意到,与DateTime()函数的相同类型输出相比,IntlDateFormatter()函数返回错误的时间戳。

    • PHP代码:**
$formatter = new IntlDateFormatter(
        'en_GB', 
        IntlDateFormatter::SHORT, 
        IntlDateFormatter::SHORT, 
        'Europe/London', 
        IntlDateFormatter::GREGORIAN,
        'dd MMMM YYYY, HH:mm'
    );

    $now = new DateTime('01-03-2023 17:00');                        
    echo '<b>DateTime() String:</b> ' . $now->format('d F Y, H:i') . '<br/>';
    echo '<b>IntlDateFormatter() String:</b> ' . $formatter->format( $now ) . '<br/><br/>';
    echo '<b>DateTime() Timestamp:</b> ' . $now->getTimestamp() . '<br/>';
    echo '<b>IntlDateFormatter() Timestamp:</b> ' . $formatter->parse( $formatter->format( $now ) );
    • 输出:**
    • 日期时间()字符串:**2023年3月1日17:00
    • IntlDateFormatter()**字符串:2023年3月1日17:00
    • 日期时间()时间戳:**1677690000
    • Intl日期格式设置程序()时间戳:**1672074000

如上所示,IntlDateFormatter()返回了正确的字符串,但是从同一个源返回了错误的时间戳值。为什么会发生这种情况?

wlp8pajw

wlp8pajw1#

当调用$formatter->parse($formatter->format($now))时,parse方法将week year值解释为year值,导致时间戳值与DateTime对象的时间戳不同。
要获得一致的输出,可以在IntlDateFormatter中使用小写yyyy而不是大写YYYY

$formatter = new IntlDateFormatter(
    'en_GB', 
    IntlDateFormatter::SHORT, 
    IntlDateFormatter::SHORT, 
    'Europe/London', 
    IntlDateFormatter::GREGORIAN,
    'dd MMMM yyyy, HH:mm'
);

$now = new DateTime('01-03-2023 17:00', new DateTimeZone('Europe/London'));

echo '<b>DateTime() String:</b> ' . $now->format('d F Y, H:i') . '<br/>';
echo '<b>IntlDateFormatter() String:</b> ' . $formatter->format( $now ) . '<br/><br/>';

echo '<b>DateTime() Timestamp:</b> ' . $now->getTimestamp() . '<br/>';
echo '<b>IntlDateFormatter() Timestamp:</b> ' . $formatter->parse( $formatter->format( $now ) ) . '<br/><br/>';

echo '<b>Default Timezone:</b> ' . date_default_timezone_get() . '<br/>';
echo '<b>DateTime() Timezone:</b> ' . $now->getTimezone()->getName() . '<br/>';
echo '<b>IntlDateFormatter() Timezone:</b> ' . $formatter->getTimeZone()->getID() . '<br/>';

相关问题