PHP 8.4.1 Released!

strtotime

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

strtotime 英文形式の日付を Unix タイムスタンプに変換する

説明

strtotime(string $datetime, ?int $baseTimestamp = null): int|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 は、nullable になりました。

例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日 (31st of May 2022) に strtotime('February') を実行すると、 31 February 2022 と解釈されて日付がオーバーフローし、 3 March になります(うるう年の場合、2 March になります)。 strtotime('1 February')strtotime('first day of February') を使うことで、この問題は回避できます。

注意:

年を 2 桁の数値で指定した場合、その値が 00-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() を使いましょう。

参考

add a note

User Contributed Notes 4 notes

up
10
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
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
1
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
0
et dot coder at gmail dot com
7 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