phpday 2025 - Call For Papers

strtotime

(PHP 4, PHP 5, PHP 7, PHP 8)

strtotime将任何英文文本日期时间描述解析为 Unix 时间戳

说明

strtotime(string $datetime, ?int $baseTimestamp = null): int|false

本函数期望接受包含英文日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 UTC 起的秒数),其值跟 baseTimestamp 参数给出的时间相关,如果没有提供 baseTimestamp 参数则为当前时间。在日期和时间格式中定义了日期字符串解析,并且有几个微秒的注意事项,强烈建议查看完整详细信息。

警告

本函数返回的 Unix 时间戳不包含时区信息,为了实现对日期/时间信息进行计算,推荐使用功能更强大的 DateTimeImmutable

本函数的每个参数都使用默认时区,除非在该参数指定了时区。注意不要在每个参数中使用不同的时区,除非是故意的。参考 date_default_timezone_get() 获取定义默认时区的各种方法。

参数

datetime

日期/时间字符串。正确格式的说明详见 日期与时间格式

baseTimestamp

时间戳,用作计算相对日期的基础。

返回值

成功则返回时间戳,否则返回 false

错误/异常

在每次调用日期/时间函数时,如果时区无效则会引发 E_NOTICE 错误。参见 date_default_timezone_set()

更新日志

版本 说明
8.0.0 现在 baseTimestamp 允许为 null。

示例

示例 #1 strtotime() 例子

<?php
echo strtotime("now"), "\n";
echo
strtotime("10 September 2000"), "\n";
echo
strtotime("+1 day"), "\n";
echo
strtotime("+1 week"), "\n";
echo
strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo
strtotime("next Thursday"), "\n";
echo
strtotime("last Monday"), "\n";
?>

示例 #2 失败检查

<?php
$str
= 'Not Good';

if ((
$timestamp = strtotime($str)) === false) {
echo
"The string ($str) is bogus";
} else {
echo
"$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>

注释

注意:

在这种情况下,“相对”日期还意味着,如果未提供日期/时间的特定组成部分,则将从 baseTimestamp 逐字获取。也就是说如果在 2022 年 5 月 31 日运行 strtotime('February'),将被解释为 31 February 2022,它将溢出到 3 March 的时间戳。(在闰年,应该是 2 March。)使用 strtotime('1 February') 或者 strtotime('first day of February') 可以避免这个问题。

注意:

如果指定的年份位数是两位数字,则其值 0-69 表示 2000-2069,70-99 表示 1970-1999。参阅下面的注释了解 32 位系统上可能的差异(结束日期可能是 2038-01-19 03:14:07)。

注意:

时间戳的有效范围通常从 Fri, 13 Dec 1901 20:45:54 UTC 到 Tue, 19 Jan 2038 03:14:07 UTC(这些日期对应 32 位有符号整数的最小值和最大值)。

在 64 位的 PHP 版本中,时间戳的有效范围实际上是无限的,因为 64 位在任一方向上都可以代表大约 2930 亿年。

注意:

不建议使用此函数对日期进行数学运算。推荐使用 DateTime::add()DateTime::sub() 函数。

参见

添加备注

用户贡献的备注 4 notes

up
14
Vyacheslav Belchuk
1 year ago
Be careful when using two numbers as the year. I came across this situation:

<?php

echo strtotime('24.11.22');
echo
date('d.m.Y H:i:s', 1669324282) . "\n\n";

// But
echo strtotime('24.11.2022');
echo
date('d.m.Y H:i:s', 1669237200);

?>

Output:

1669324282
25.11.2022 00:11:22

1669237200
24.11.2022 00:00:00
up
3
elsiland at yahoo dot com
1 month ago
Not sure why, but
<?php
echo strtotime("+2 hours"), "\n";
echo
strtotime("+2 hrs"), "\n";
echo
strtotime("+2 hourss"), "\n";
?>

are returning +2 hours, -2 hours, +8 hours. The latter two should be errors instead.
up
6
info at pipasjourney dot com
1 year ago
Be aware of this: 1 month before the 31st day, it will return the same month:

<?php
echo date('m', strtotime('2023-05-30 -1 month')) ; //returns 04
echo date('m', strtotime('2023-05-31 -1 month')) ; //returns 05, not 04
?>

So, don't use this to operate on the month of the result.
A better way to know what month was the previous month would be:

<?php
//considering today is 2023-05-31...

$firstOfThisMonth = date('Y-m') . '-01'; //returns 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; //returns 04
?>
up
0
et dot coder at gmail dot com
8 months ago
> The Unix timestamp that this function returns does not contain information about time zones. In order to do calculations with date/time information, you should use the more capable DateTimeImmutable.

important - does not contain

<?php
date_default_timezone_set
('Europe/Berlin');

// .... a lot of code

echo $a = strtotime('yesterday 00:00');

// in $a hour = 23:00:00 and you may not know about it
// https://onlinephp.io/c/ef696
// use DateTimeImmutable
To Top