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
更改为 U
和 u
等,但我找不到 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()
之前更改要转换的时区。
我正在尝试使用 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
更改为 U
和 u
等,但我找不到 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()
之前更改要转换的时区。