使用两位数作为年份时要小心。我遇到了这种情况
<?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);
?>
输出
1669324282
25.11.2022 00:11:22
1669237200
24.11.2022 00:00:00
(PHP 4, PHP 5, PHP 7, PHP 8)
strtotime — 将任何英文文本日期时间描述解析为 Unix 时间戳
该函数期望得到一个包含英文日期格式的字符串,并尝试将该格式解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数),相对于 baseTimestamp
中给定的时间戳,或者如果没有提供 baseTimestamp
,则相对于当前时间。日期字符串解析在 日期和时间格式 中定义,并且有一些微妙的注意事项。强烈建议您查看那里的所有详细信息。
此函数返回的 Unix 时间戳不包含有关时区的信息。为了对日期/时间信息进行计算,您应该使用功能更强大的 DateTimeImmutable。
此函数的每个参数都使用默认时区,除非在该参数中指定了时区。请注意,除非有意,否则不要在每个参数中使用不同的时区。有关定义默认时区的各种方法,请参见 date_default_timezone_get()。
成功时返回时间戳,否则返回 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 "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')
,它将被解释为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()。
使用两位数作为年份时要小心。我遇到了这种情况
<?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);
?>
输出
1669324282
25.11.2022 00:11:22
1669237200
24.11.2022 00:00:00
请注意这一点:在 31 日的前一个月,它将返回同一个月
<?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
?>
因此,不要使用它来操作结果的月份。
知道上个月是什么月份的更好方法是
<?php
// 假设今天是 2023-05-31...
$firstOfThisMonth = date('Y-m') . '-01'; // 返回 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; // 返回 04
?>
> 此函数返回的 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