PHP Conference Japan 2024

strtotime

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

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

描述

strtotime(字符串 $datetime, ?整数 $baseTimestamp = null): 整数|false

此函数预期接收包含英文日期格式的字符串,并尝试将其解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数),相对于 baseTimestamp 中给定的时间戳,或者如果未提供 baseTimestamp 则相对于当前时间。日期字符串解析在日期和时间格式中定义,并有一些细微的考虑因素。强烈建议仔细阅读那里的完整细节。

警告

此函数返回的 Unix 时间戳不包含有关时区的信息。为了进行日期/时间信息的计算,您应该使用功能更强大的DateTimeImmutable

此函数的每个参数都使用默认时区,除非在该参数中指定了时区。请注意,除非有意为之,否则不要在每个参数中使用不同的时区。有关定义默认时区的各种方法,请参阅date_default_timezone_get()

参数

datetime

日期/时间字符串。有效格式在日期和时间格式中解释。

baseTimestamp

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

返回值

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

错误/异常

如果时区无效,则每次调用日期/时间函数都会生成一个E_WARNING。另请参阅date_default_timezone_set()

变更日志

版本 描述
8.0.0 baseTimestamp 现在可以为空。

示例

示例 #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
"字符串 ($str) 无效";
} else {
echo
"$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>

注释

注意:

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

注意:

如果年份以两位数字格式指定,则 00-69 之间的数值映射到 2000-2069,而 70-99 则映射到 1970-1999。有关 32 位系统上的可能差异(可能的日期可能以 2038-01-19 03:14:07 结束),请参见下面的注释。

注意:

时间戳的有效范围通常是从 1901 年 12 月 13 日星期五 20:45:54 UTC 到 2038 年 1 月 19 日星期二 03:14:07 UTC。(这些是与 32 位有符号整数的最小值和最大值相对应的日期。)

对于 64 位版本的 PHP,时间戳的有效范围实际上是无限的,因为 64 位可以表示大约 2930 亿年的正负时间。

注意:

不建议将此函数用于数学运算。最好使用DateTime::add()DateTime::sub()

另请参阅

添加注释

用户贡献的注释 4 个注释

Vyacheslav Belchuk
1 年前
使用两位数表示年份时要小心。我遇到了这种情况

<?php

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

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

?>

输出

1669324282
25.11.2022 00:11:22

1669237200
24.11.2022 00:00:00
elsiland at yahoo dot com
1 个月前
不确定为什么,但是
<?php
echo strtotime("+2 hours"), "\n";
echo
strtotime("+2 hrs"), "\n";
echo
strtotime("+2 hourss"), "\n";
?>

返回 +2 小时、-2 小时、+8 小时。后两者应该返回错误而不是数值。
info at pipasjourney dot com
1 年前
请注意:在 31 号之前的一个月,它将返回同一个月

<?php
echo date('m', strtotime('2023-05-30 -1 month')) ; //返回 04
echo date('m', strtotime('2023-05-31 -1 month')) ; //返回 05,而不是 04
?>

所以,不要使用此方法来操作结果月份。
更好的方法是了解上个月是几月

<?php
//假设今天是 2023-05-31...

$firstOfThisMonth = date('Y-m') . '-01'; //返回 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; //返回 04
?>
et dot coder at gmail dot com
8个月前
> 此函数返回的 Unix 时间戳不包含时区信息。要进行日期/时间信息的计算,应使用功能更强大的 DateTimeImmutable。

重要 - 不包含

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

// .... 很多代码

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

// 在 $a 中,小时为 23:00:00,你可能不知道这一点
// https://onlinephp.io/c/ef696
// 使用 DateTimeImmutable
To Top