2024 年日本 PHP 研討會

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 現在可以為 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
"字串 ($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 到 2038 年 1 月 19 日星期二 03:14:07。(這些日期對應於 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