Php IntlDateFormatter class 不显示 unix 时间戳

Php IntlDateFormatter class does not show unix timestamp

我正在尝试使用 IntlDateFormatter 获得 unix timestamp

我试过了

$formatter = new IntlDateFormatter(
        'fr_FR',
        IntlDateFormatter::FULL,
        IntlDateFormatter::FULL,
        'Europe/Paris',
        IntlDateFormatter::TRADITIONAL,
        'unix'
    );
echo $formatter->format(strtotime('now'));

给我 2022,而我正在尝试以这种格式获取它 1644601950

我也尝试过将 unix 更改为 Uu 等,但我找不到 unix timestamp 中 [=] 的正确关键字14=] class.

如果我将 'unix' 更改为 'YY-MM-d',它会给我 22-02-11,但它不是 unix timestamp 格式。

快速回答

使用 IntlDateFormatter class 获取 unix 时间戳。使用此代码。

$formatter = new IntlDateFormatter(
    'fr_FR',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'Europe/Paris',
    IntlDateFormatter::TRADITIONAL
);
echo $formatter->parse($formatter->format(strtotime('now')));

似乎从这个 class 获取时间戳的唯一方法只能使用 IntlDateFormatter::parse() 方法。

时间戳

时间戳始终以自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数来衡量,无论您使用什么函数或 classes 来获取它。示例 time(), mktime(), DateTime::getTimestamp().

从特定 date/time 获取时间戳。

在这个例子中,假设我的服务器 php.ini 时区是 Asia/Bangkok 而你在 中得到这个 date/time Asia/Macau.

// server php.ini timezone is Asia/Bangkok
// set the date/time input.
// assume that it is Asia/Macau timezone.
$datetime = '2025-03-12 15:34:26';

$timestamp = strtotime($datetime);
echo $timestamp.'<br>';// 1741768466

// if you use function `date()`, the result will be wrong! because the timestamp is incorrectly parse using server timezone.
echo 'use date(): ' . date('Y-m-d H:i:s P', $timestamp) . '<br>';// 2025-03-12 15:34:26 +07:00 WRONG! incorrect timezone.

// even if you use `\IntlDateFormatter()` class, with or without set timezome the result still be wrong!
$formatter = new \IntlDateFormatter(
    'en',
    \IntlDateFormatter::FULL,
    \IntlDateFormatter::FULL,
    new \DateTimeZone('Asia/Macau'),
    \IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd kk:mm:ss ZZZZZ'
);
echo $formatter->format($timestamp).'<br>';// 2025-03-12 16:34:26 +08:00 WRONG! time does not matched.
$formatter->setTimeZone(new \DateTimeZone('Asia/Macau'));
echo $formatter->format($timestamp).'<br>';// 2025-03-12 16:34:26 +08:00 WRONG! time does not matched.

上面的所有示例都是错误的,因为时间戳是根据服务器时区 (php.ini) 解析的。

获取正确时区的时间戳。

正如@Álvaro González 评论的那样,您可以使用 strtotime('date/time timzone'); 在某些时区获取时间戳,但您也可以使用 \Datetime()\IntlDateFormatter classes.

示例:

// server php.ini timezone is Asia/Bangkok
// set the date/time input.
// assume that it is Asia/Macau timezone.
$datetime = '2025-03-12 15:34:26';

$timestamp = strtotime($datetime . ' Asia/Macau');
echo $timestamp .'<br>';// 1741764866
echo 'use date(): ' . date('Y-m-d H:i:s P', $timestamp) . '<br>';// 2025-03-12 14:34:26 +07:00 CORRECT! but time zone is Bangkok as specified in php.ini (-1 hour for Macau to Bangkok).

$formatter = new \IntlDateFormatter(
    'en',
    \IntlDateFormatter::FULL,
    \IntlDateFormatter::FULL,
    new \DateTimeZone('Asia/Macau'),
    \IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd kk:mm:ss ZZZZZ'
);
echo $formatter->format($timestamp).'<br>';// 2025-03-12 15:34:26 +08:00 CORRECT!

// use `DateTime()` class to get timestamp in certain timezone.
$date = new DateTime($datetime, new \DateTimeZone('Asia/Macau'));
$timestamp2 = (int) $date->getTimestamp();
echo $timestamp2.'<br>';// 1741764866

$formatter = new \IntlDateFormatter(
    'en',
    \IntlDateFormatter::FULL,
    \IntlDateFormatter::FULL,
    new \DateTimeZone('Asia/Macau'),
    \IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd kk:mm:ss ZZZZZ'
);
echo $formatter->format($timestamp2) . '<br>';// 2025-03-12 15:34:26 +08:00 CORRECT!

// use `\IntlDateFormatter()` class to get timestamp in certain timezone.
$formatter = new IntlDateFormatter(
    'en-US',
    IntlDateFormatter::NONE,
    IntlDateFormatter::NONE,
    new \DateTimeZone('Asia/Macau'),
    IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd kk:mm:ss'
);
$timestamp3 = (int) $formatter->parse($datetime);
echo $timestamp3 . '<br>';// 1741764866 CORRECT!

要从 \IntlDateFormatter() class 获取时间戳,您必须在构造函数中设置与 date/time 源格式匹配的模式。

跨时区转换date/time

在这个例子中,我将根据从 Asia/Macau 时区获得的 date/time 跨时区转换 date/time 结果。

我会用IntlDateFormatter()class来转换

// server php.ini timezone is Asia/Bangkok
// set the date/time input.
// assume that it is date/time from Asia/Macau timezone.
$datetime = '2025-03-12 15:34:26';

$tsmacau = strtotime($datetime . ' Asia/Macau');// 1741764866

$formatter = new \IntlDateFormatter(
    'en',
    \IntlDateFormatter::FULL,
    \IntlDateFormatter::FULL,
    new \DateTimeZone('Asia/Macau'),// timezone for input timestamp.
    \IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd kk:mm:ss ZZZZZ'
);
// convert to Asia/Bangkok timezone.
$formatter->setTimezone(new \DateTimeZone('Asia/Bangkok'));
echo $formatter->format($tsmacau).'<br>';// 2025-03-12 14:34:26 +07:00

// convert to Europe/Paris timezone
$formatter->setTimezone(new \DateTimeZone('Europe/Paris'));
echo $formatter->format($tsmacau).'<br>';// 2025-03-12 08:34:26 +01:00

在这种情况下,您必须知道时间戳的时区,因为您必须将输入时区设置到 class 构造函数中,并在调用 format() 之前更改要转换的时区。