【PHP8.x】strtotime関数の使い方

作成日: 更新日:

strtotime関数は、英語で書かれた日時を表す文字列をUnixタイムスタンプという数値に変換する関数です。Unixタイムスタンプとは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を表す、コンピュータが扱いやすい整数値のことです。この関数は、人間が普段使うような「今日から1週間後」や「来月の最終日」といった自然言語の表現を、プログラミングで処理しやすい日時データに変換する際に非常に役立ちます。

引数として、日時を示す様々な形式の文字列を受け取ることができます。例えば、「now」「+1 day」「next Monday」「last day of next month」など、多様な英語表現に対応しており、開発者が日付計算のロジックを柔軟かつ簡単に記述できるように設計されています。成功した場合、指定された日時に対応するUnixタイムスタンプを整数値で返します。

もし、指定された文字列が有効な日時として認識できなかった場合や、変換処理が失敗した場合には、戻り値としてfalseが返されます。そのため、この関数を利用する際には、戻り値がfalseでないかを確認し、適切にエラー処理を行うことが重要です。

strtotime関数は、PHPで日付や時刻を扱う上での基本的ながらも非常に強力なツールであり、Webアプリケーション開発において日付関連の機能を実装する際に広く活用されています。これにより、複雑な日付計算を簡潔なコードで実現し、開発の効率を大きく向上させることができます。

基本的な使い方

構文(syntax)

<?php
$timestamp = strtotime("now");

引数(parameters)

string $datetime, ?int $baseTimestamp = null

  • string $datetime: 変換したい日付・時刻の文字列
  • ?int $baseTimestamp = null: $datetime が相対的な表現の場合の基準となるタイムスタンプ

戻り値(return)

int|false

指定された文字列をUnixタイムスタンプ(1970年1月1日午前0時からの秒数)の整数値で返します。解釈できない場合はfalseを返します。

サンプルコード

PHP strtotimeの2桁年問題と対策

<?php

/**
 * Demonstrates a common "bug" or unexpected behavior of strtotime
 * when parsing two-digit years, which can lead to incorrect date interpretations.
 *
 * PHP's strtotime function interprets two-digit years (YY) based on a 70-year window
 * relative to the current century. Specifically:
 * - Years from 00-69 are typically interpreted as 20xx (e.g., '60' becomes 2060).
 * - Years from 70-99 are typically interpreted as 19xx (e.g., '70' becomes 1970).
 *
 * This behavior can cause issues if the intended century differs from strtotime's assumption.
 */
function demonstrateStrtotimeTwoDigitYearParsingBug(): void
{
    echo "--- strtotime Two-Digit Year Parsing Bug Demonstration ---\n\n";

    // Example 1: Year '60' (often intended as 1960, but parsed as 2060 by strtotime)
    $dateString1 = "01/01/60";
    $timestamp1 = strtotime($dateString1);

    if ($timestamp1 === false) {
        echo "Error: Could not parse '{$dateString1}'\n";
    } else {
        echo "Input: '{$dateString1}'\n";
        echo "Parsed Full Date: " . date('Y-m-d', $timestamp1) . "\n";
        echo "  (Unexpectedly parsed as 2060, not 1960)\n\n";
    }

    // Example 2: Year '70' (often intended as 2070, but parsed as 1970 by strtotime)
    $dateString2 = "12-25-70";
    $timestamp2 = strtotime($dateString2);

    if ($timestamp2 === false) {
        echo "Error: Could not parse '{$dateString2}'\n";
    } else {
        echo "Input: '{$dateString2}'\n";
        echo "Parsed Full Date: " . date('Y-m-d', $timestamp2) . "\n";
        echo "  (Parsed as 1970, which might be intended, or unintended if 2070 was expected)\n\n";
    }

    // Example 3: Year '23' (commonly intended as 2023, and parsed as 2023)
    $dateString3 = "2023-03-23"; // Using 4-digit year for clarity, but demonstrating 2-digit implication
    $timestamp3 = strtotime($dateString3);

    if ($timestamp3 === false) {
        echo "Error: Could not parse '{$dateString3}'\n";
    } else {
        echo "Input: '{$dateString3}'\n";
        echo "Parsed Full Date: " . date('Y-m-d', $timestamp3) . "\n";
        echo "  (When '23' is used with another format like '03/23', it's still 2023)\n\n";
    }

    echo "--- Key Takeaway for System Engineers ---\n";
    echo "To avoid ambiguity and potential bugs with strtotime's two-digit year parsing,\n";
    echo "ALWAYS use four-digit years (YYYY) in your date strings when possible.\n";
    echo "Alternatively, for strict parsing of specific formats, consider using the DateTime::createFromFormat() method.\n";
}

// Execute the demonstration function to see the output
demonstrateStrtotimeTwoDigitYearParsingBug();

PHPのstrtotime関数は、人間が読みやすいさまざまな形式の日付文字列を、コンピュータが扱いやすいUNIXタイムスタンプ(1970年1月1日00:00:00 UTCからの秒数)に変換する便利な関数です。引数$datetimeに日付文字列を渡して利用し、オプションで基準となるUNIXタイムスタンプ$baseTimestampを指定することも可能です。変換に成功した場合はタイムスタンプを整数で返し、失敗した場合はfalseを返します。

この関数は柔軟性が高い一方で、二桁の年(YY)を解釈する際に注意が必要な挙動があります。strtotimeは、二桁年を現在の世紀を基準とした70年間の窓で自動判別します。具体的には、「00」から「69」までの年は20xx年(例: '60'は2060年)として解釈され、「70」から「99」までの年は19xx年(例: '70'は1970年)として解釈されます。

この自動判別は、開発者の意図と異なる日付の解釈を引き起こすことがあり、「バグ」として認識されることがあります。例えば、サンプルコードで示されるように、「01/01/60」は1960年を意図しても2060年と解析されてしまいます。逆に「12-25-70」は1970年と解析され、2070年を意図していた場合には誤解釈となります。

このような曖昧さや意図しない日付の解釈を避けるためには、日付文字列には常に四桁の年(YYYY)を使用することが強く推奨されます。また、特定の厳密なフォーマットで日付を解析したい場合は、DateTime::createFromFormat()メソッドの利用を検討してください。これにより、予期せぬ問題を防ぎ、堅牢なシステムを構築できます。

PHPのstrtotime関数は、日付文字列をタイムスタンプに変換する際に便利な機能ですが、2桁の年(例: '60'や'70')を解析する際には注意が必要です。この関数は、'00'から'69'の年を20xx年、'70'から'99'の年を19xx年と自動的に判断する独自のルールを持っているため、意図しない日付が生成される可能性があります。これは「バグ」と表現されることがありますが、関数の仕様です。この予期せぬ日付の解釈を防ぎ、システムの誤動作を避けるためには、日付文字列には必ず4桁の年(YYYY)を使用してください。また、より厳密な形式で日付を解析したい場合は、DateTime::createFromFormat()メソッドの利用を検討しましょう。strtotime関数が日付解析に失敗した際にはfalseを返すため、戻り値の確認も必ず行ってください。

PHP strtotimeで1日前をUNIXタイムスタンプで取得する

<?php

/**
 * strtotime関数を使って、現在時刻から1日前をUNIXタイムスタンプで取得するサンプルコード。
 */
function getYesterdayTimestamp(): int|false
{
  // 現在時刻を基準に1日前を表す文字列をstrtotimeに渡す。
  $yesterday = strtotime("1 day ago");

  // 取得できなかった場合はfalseを返す。
  return $yesterday;
}

// 関数を実行して結果を表示する。
$yesterdayTimestamp = getYesterdayTimestamp();

if ($yesterdayTimestamp !== false) {
  echo "昨日のUNIXタイムスタンプ: " . $yesterdayTimestamp . PHP_EOL;
  echo "昨日の日付: " . date("Y-m-d H:i:s", $yesterdayTimestamp) . PHP_EOL;
} else {
  echo "日付の取得に失敗しました。" . PHP_EOL;
}

strtotime関数は、日付を表す文字列をUnixタイムスタンプ(1970年1月1日午前0時0分0秒からの経過秒数)に変換するPHPの組み込み関数です。引数には、変換したい日付文字列 $datetime を指定します。オプションとして、基準となるUnixタイムスタンプ $baseTimestamp を指定することも可能です。$baseTimestamp を省略した場合、現在の時刻が基準となります。

このサンプルコードでは、strtotime("1 day ago") を使用して、現在時刻から1日前のUnixタイムスタンプを取得しています。"1 day ago" は「1日前」を意味する日付文字列です。strtotime関数は、変換に成功した場合はUnixタイムスタンプを整数値で返し、失敗した場合は false を返します。

サンプルコードでは、getYesterdayTimestamp 関数内で strtotime 関数を呼び出し、その結果を $yesterday 変数に格納しています。そして、$yesterdayfalse でないことを確認してから、Unixタイムスタンプと、date関数を使ってフォーマットした日付文字列を表示します。date 関数は、Unixタイムスタンプを指定したフォーマットの日付文字列に変換する関数です。strtotime関数とdate関数を組み合わせることで、日付計算や表示形式の変更が容易になります。

strtotime関数は、人間が読める形式の日付文字列をUNIXタイムスタンプ(1970年1月1日からの秒数)に変換します。引数には、日付を表す文字列を渡します。この例では"1 day ago"で現在時刻から1日前を指定しています。

注意点として、strtotime関数は解析に失敗するとfalseを返すことがあります。必ず戻り値がfalseでないか確認し、エラーハンドリングを行いましょう。また、タイムゾーンの設定が正しくないと、意図しない日時が返される可能性があります。date_default_timezone_set()などでタイムゾーンを明示的に設定することを推奨します。日付文字列の形式に誤りがあると、解析に失敗する原因になりますので、注意してください。

PHP strtotimeで日付を加算する

<?php

/**
 * strtotime関数を使用して日付や時刻を加算する様々な例を示します。
 *
 * strtotimeは日付/時刻の文字列をUnixタイムスタンプに変換しますが、
 * 相対的な日時表現を用いることで、日付の加算(または減算)を簡単に行うことができます。
 */
function demonstrateStrtotimeAddition(): void
{
    // 現在のUnixタイムスタンプと、それが表す日時を表示
    $currentTimestamp = time();
    echo "現在のUnixタイムスタンプ: " . $currentTimestamp . "\n";
    echo "現在の日時: " . date('Y-m-d H:i:s', $currentTimestamp) . "\n\n";

    // --- 例1: 現在の日付から1日後を計算 ---
    // strtotimeの第一引数に相対的な日付表現を指定し、第二引数を省略すると、現在時刻が基準となります。
    $oneDayLaterTimestamp = strtotime('+1 day');
    if ($oneDayLaterTimestamp !== false) {
        echo "1日後のUnixタイムスタンプ: " . $oneDayLaterTimestamp . "\n";
        echo "1日後の日時: " . date('Y-m-d H:i:s', $oneDayLaterTimestamp) . "\n\n";
    } else {
        echo "1日後の計算に失敗しました。\n\n";
    }

    // --- 例2: 特定の日付から3ヶ月後を計算 ---
    // 第二引数に基準となるタイムスタンプを指定することで、特定の日付からの加算が可能です。
    $baseDateString = '2023-04-15 10:00:00';
    $baseTimestamp = strtotime($baseDateString);

    if ($baseTimestamp === false) {
        echo "基準日 ('" . $baseDateString . "') の解析に失敗しました。\n\n";
        return; // 解析失敗時はこれ以上処理を進めない
    }

    echo "基準となる日時: " . date('Y-m-d H:i:s', $baseTimestamp) . "\n";
    $threeMonthsLaterTimestamp = strtotime('+3 months', $baseTimestamp);

    if ($threeMonthsLaterTimestamp !== false) {
        echo "基準日から3ヶ月後のUnixタイムスタンプ: " . $threeMonthsLaterTimestamp . "\n";
        echo "基準日から3ヶ月後の日時: " . date('Y-m-d H:i:s', $threeMonthsLaterTimestamp) . "\n\n";
    } else {
        echo "3ヶ月後の計算に失敗しました。\n\n";
    }

    // --- 例3: 現在の時刻から1時間30分後を計算 ---
    // 時間単位での加算も可能です。
    $oneHourThirtyMinutesLaterTimestamp = strtotime('+1 hour 30 minutes');
    if ($oneHourThirtyMinutesLaterTimestamp !== false) {
        echo "1時間30分後のUnixタイムスタンプ: " . $oneHourThirtyMinutesLaterTimestamp . "\n";
        echo "1時間30分後の日時: " . date('Y-m-d H:i:s', $oneHourThirtyMinutesLaterTimestamp) . "\n\n";
    } else {
        echo "1時間30分後の計算に失敗しました。\n\n";
    }
}

// 関数を実行し、日付加算の例を出力
demonstrateStrtotimeAddition();

PHPのstrtotime関数は、人間が読みやすい日付や時刻の文字列を、コンピューターが扱いやすいUnixタイムスタンプ(1970年1月1日 00:00:00 UTCからの秒数)に変換する際に使用されます。この関数の強力な機能の一つとして、日付や時刻の加算(または減算)を簡単に行うことができます。

第一引数$datetimeには、日付や時刻の文字列を指定します。ここで「+1 day」や「+3 months」「+1 hour 30 minutes」といった相対的な日時表現を使用することで、指定された期間の日時を加算(または減算)できます。第二引数$baseTimestampはオプションで、加算の基準となるUnixタイムスタンプを指定します。この引数を省略した場合、現在時刻が基準となります。

関数が成功すると、加算後の日付や時刻を表すUnixタイムスタンプ(整数値)が返されます。もし指定された文字列を解析できなかった場合は、falseが返されるため、戻り値がfalseでないかを確認することが重要です。

サンプルコードでは、現在の日時から「1日後」や「1時間30分後」を計算する例を示しています。また、特定の日時(例: '2023-04-15 10:00:00')を基準として「3ヶ月後」を計算するために、第二引数にその基準となるタイムスタンプを渡す方法も示しています。これにより、様々な要件に応じた柔軟な日付計算が可能です。

strtotime関数は、日付の解析に成功するとUnixタイムスタンプ(整数値)を返しますが、失敗した場合はfalseを返します。そのため、常にfalseでないか確認する処理を記述してください。第一引数には+1 day+3 monthsのように相対的な日時表現を用いることで、日付の加算を簡潔に行えます。第二引数に基準となるUnixタイムスタンプを指定すれば、現在時刻以外の特定の日時からの加算が可能です。省略した場合は現在時刻が基準となります。無効な日付文字列を渡した場合も解析に失敗しfalseを返しますので、入力値の形式には十分注意してください。この関数は多くの相対表現を解釈できますが、意図しない挙動を防ぐため、実際の利用前にテストで確認することが推奨されます。

【PHP8.x】strtotime関数の使い方 | いっしー@Webエンジニア