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

作成日: 更新日:

strftime関数は、ローカルのロケール設定に基づいて、日付と時刻を指定された形式で文字列にフォーマットする関数です。PHP 4.0.6以降で使用可能です。タイムスタンプを基に、日付や時刻に関する様々な情報を文字列として取得したい場合に利用します。

この関数は、書式指定文字列(format)とオプションのタイムスタンプ(timestamp)を引数として受け取ります。書式指定文字列には、パーセント記号(%)で始まる特定の変換指定子が含まれており、それぞれが日付や時刻の特定の部分(例えば、年、月、日、時間、分、秒など)を表します。タイムスタンプが指定されない場合、現在のローカル時刻が使用されます。

strftime関数は、指定された書式に従ってフォーマットされた日付と時刻の文字列を返します。もし、無効な書式指定子が含まれている場合や、タイムスタンプが無効な場合など、何らかのエラーが発生した場合には、falseを返します。

strftime関数は、ロケール設定に依存するため、setlocale関数を使用して適切なロケールを設定する必要があります。ロケール設定を変更しない場合、システムデフォルトのロケールが使用されます。異なるロケールを設定することで、日付や時刻の表示形式を地域や言語に合わせて変更できます。例えば、日本語ロケールを使用すれば、曜日を日本語で表示することができます。

しかし、strftime関数はWindows環境下では全ての変換指定子が利用できるとは限りません。また、PHP 8.1.0以降、strftime関数の動作はOSのstrftime関数に依存しなくなりました。代わりに、PHPが内部的に実装したstrftime関数が使用されるようになり、一貫性が向上しています。

基本的な使い方

構文(syntax)

strftime(string $format, int $timestamp = time()): string|false

引数(parameters)

string $format, ?int $timestamp = null

  • string $format: フォーマット文字列。日付や時刻の表示形式を指定します。
  • ?int $timestamp = null: タイムスタンプ。指定しない場合は現在の時刻が使用されます。

戻り値(return)

string|false

指定されたロケール形式にフォーマットされた日付と時刻を表す文字列を返します。フォーマットに失敗した場合は false を返します。

サンプルコード

PHP strftime代替処理をする

<?php

/**
 * Provides an alternative to the deprecated strftime() function for common format codes.
 *
 * This function attempts to mimic the behavior of strftime() by converting its
 * format codes to date() compatible codes and then using date().
 * It primarily supports common, non-locale-specific format codes.
 * For full locale-dependent formatting (e.g., month/day names in different languages,
 * or specific locale formats like %c, %x, %X truly respecting system locale),
 * the IntlDateFormatter class (from the Intl extension) is the recommended and more robust alternative.
 *
 * @param string $format    The format string, similar to strftime().
 * @param int|null $timestamp The optional Unix timestamp. Defaults to the current local time.
 * @return string The formatted date/time string.
 */
function my_strftime_alternative(string $format, ?int $timestamp = null): string
{
    // Use the current timestamp if none is provided.
    $timestamp = $timestamp ?? time();

    // Mapping of common strftime() format codes to date() format codes.
    // This mapping does not cover all strftime nuances (e.g., space padding for %e,
    // or full locale-awareness for month/day names).
    $replaceMap = [
        // Year
        '%Y' => 'Y', // Four-digit year (e.g., 2023)
        '%y' => 'y', // Two-digit year (e.g., 23)
        // Month
        '%m' => 'm', // Numeric month (01-12)
        '%B' => 'F', // Full month name (e.g., January)
        '%b' => 'M', // Abbreviated month name (e.g., Jan)
        // Day
        '%d' => 'd', // Day of the month (01-31)
        '%e' => 'j', // Day of the month, without leading zeros (1-31)
        '%w' => 'w', // Numeric day of the week (0=Sunday, 6=Saturday)
        '%a' => 'D', // Abbreviated weekday name (e.g., Sun)
        '%A' => 'l', // Full weekday name (e.g., Sunday)
        '%j' => 'z', // Day of the year (0-365) - strftime's %j is 1-indexed (001-366)
        // Hour
        '%H' => 'H', // Hour (00-23)
        '%I' => 'h', // Hour (01-12)
        '%p' => 'A', // AM or PM
        // Minute
        '%M' => 'i', // Minute (00-59)
        // Second
        '%S' => 's', // Second (00-59)
        // Timezone
        '%Z' => 'T', // Time zone name (e.g., EST)
        '%z' => 'O', // Time zone offset (+0500)
        // Date and Time (approximations for common locale outputs)
        '%c' => 'D M j H:i:s Y', // Equivalent to common %c output (e.g., Thu Dec 25 10:30:00 2008)
        '%x' => 'm/d/Y',         // Equivalent to common %x output (e.g., 12/25/2008)
        '%X' => 'H:i:s',         // Equivalent to common %X output (e.g., 10:30:00)
        // Literal percent sign
        '%%' => '%',
    ];

    // Replace strftime format codes with date() format codes.
    $dateFormattedString = strtr($format, $replaceMap);

    // Format the timestamp using date().
    return date($dateFormattedString, $timestamp);
}

strftime関数は、指定された書式に従って日付や時刻を文字列に変換するPHPの組み込み関数です。しかし、PHP 8.1以降で非推奨となり、将来のバージョンで削除される予定です。そのため、このサンプルコードでは、非推奨となったstrftime関数の一般的な書式コードに対応する代替機能として、my_strftime_alternative関数を提供しています。

my_strftime_alternative関数は、strftime形式の書式指定を内部でPHPのdate()関数が理解できる形式に変換し、日付と時刻を整形した文字列として返します。引数$formatは、strftime関数と同様に、日付や時刻の表示形式を指定する文字列です。例えば、'%Y-%m-%d''2023-12-25'のように整形されます。引数$timestampはオプションで、整形したいUnixタイムスタンプを整数で指定します。省略された場合は、現在のローカルタイムが使用されます。この関数は、整形された日付と時刻の文字列を返します。

ただし、この代替関数は一般的な書式コードに対応していますが、ロケール(地域や言語設定)に依存する複雑な日付フォーマットや、strftimeが持つ全ての細かな挙動を完全に再現するわけではありません。ロケールに完全に依存した日付・時刻の整形を行う場合は、PHPのIntl拡張機能に含まれるIntlDateFormatterクラスの利用が推奨されます。

strftime関数はPHP 8.1で非推奨となり、PHP 8.4では削除されるため、代替手段が必要です。このサンプルコードは、基本的なstrftimeの書式コードをdate()関数で再現しますが、ロケール(地域設定)に依存する多言語対応や、%c%xのような地域固有の書式を完全に再現することはできません。特に、%j%eなどの一部コードはstrftimeと挙動が異なる場合がありますのでご注意ください。より厳密なロケール対応や国際化された日付フォーマットが必要な場合は、IntlDateFormatterクラスの利用が最も推奨される、堅牢な代替手段です。

PHP strftime でロケール別日付フォーマット

<?php

/**
 * strftime関数とロケールを使用して日付と時刻をフォーマットするサンプルコードです。
 *
 * strftime関数はPHP 8.1で非推奨になり、PHP 14.0で削除される予定です。
 * 新しいプロジェクトでは IntlDateFormatter クラスなどの代替機能の使用が推奨されます。
 */
function demonstrateStrftimeWithLocale(): void
{
    echo "--- strftime 関数とロケールのデモンストレーション ---\n\n";

    // 現在のタイムスタンプを取得します。
    $timestamp = time();

    echo "現在のタイムスタンプ: " . date('Y-m-d H:i:s', $timestamp) . "\n\n";

    // ロケールを設定し、strftimeで日付と時刻をフォーマットします。
    // setlocale() 関数は、OSによってサポートされるロケール名が異なります。
    // 複数の候補を渡すことで、より多くの環境で動作する可能性を高めています。
    // setlocale() は設定が成功した場合にロケール文字列を返し、失敗した場合は false を返します。

    // 1. 日本語ロケールでのフォーマット例
    // 一般的な日本語ロケール名: 'ja_JP.UTF-8' (Linux/macOS), 'Japanese_Japan.932' (Windows)
    $localeJp = setlocale(LC_TIME, 'ja_JP.UTF-8', 'Japanese_Japan.932', 'jpn');
    if ($localeJp !== false) {
        echo "ロケールを日本語に設定: " . $localeJp . "\n";
        // %A: 曜日の完全な名前 (例: 木曜日)
        // %x: ロケールの日付表現 (例: 2023年10月26日)
        // %R: 24時間表記の時刻 (例: 14:30)
        echo "日本語での日付と時刻: " . strftime('%A, %x %R', $timestamp) . "\n\n";
    } else {
        echo "警告: 日本語ロケールの設定に失敗しました。ロケールに依存しない結果が表示される可能性があります。\n\n";
    }

    // 2. 英語 (米国) ロケールでのフォーマット例
    // 一般的な英語ロケール名: 'en_US.UTF-8' (Linux/macOS), 'English_United States.1252' (Windows)
    $localeEn = setlocale(LC_TIME, 'en_US.UTF-8', 'English_United States.1252', 'enu');
    if ($localeEn !== false) {
        echo "ロケールを英語 (米国) に設定: " . $localeEn . "\n";
        echo "英語での日付と時刻: " . strftime('%A, %x %R', $timestamp) . "\n\n";
    } else {
        echo "警告: 英語 (米国) ロケールの設定に失敗しました。ロケールに依存しない結果が表示される可能性があります。\n\n";
    }

    // 3. フランス語ロケールでのフォーマット例
    // 一般的なフランス語ロケール名: 'fr_FR.UTF-8' (Linux/macOS), 'French_France.1252' (Windows)
    $localeFr = setlocale(LC_TIME, 'fr_FR.UTF-8', 'French_France.1252', 'fra');
    if ($localeFr !== false) {
        echo "ロケールをフランス語に設定: " . $localeFr . "\n";
        echo "フランス語での日付と時刻: " . strftime('%A, %x %R', $timestamp) . "\n\n";
    } else {
        echo "警告: フランス語ロケールの設定に失敗しました。ロケールに依存しない結果が表示される可能性があります。\n\n";
    }

    // strftime関数の戻り値がfalseになるケースの例
    // 無効なタイムスタンプが与えられた場合など、strftimeは false を返すことがあります。
    echo "--- strftime 関数が false を返すケース ---\n\n";
    // 極端に小さい負の値をタイムスタンプとして指定してみます。
    $invalidTimestamp = -9999999999;
    $result = strftime('%Y-%m-%d %H:%M:%S', $invalidTimestamp);
    if ($result === false) {
        echo "strftime関数は、無効または極端なタイムスタンプで呼び出された場合、false を返しました。\n";
    } else {
        echo "strftime関数は、無効または極端なタイムスタンプで呼び出された場合、'" . $result . "' を返しました (OSやPHPのバージョンに依存します)。\n";
    }

    echo "\nデモンストレーションを終了します。\n";
}

// 関数を実行します。
demonstrateStrftimeWithLocale();

PHPのstrftime関数は、日付と時刻を特定のフォーマットで文字列として整形するために利用されます。第一引数$formatには、年、月、日、曜日、時刻などをどのように表示するかを指定するフォーマット文字列を渡します。第二引数$timestampはオプションで、整形対象となるUNIXタイムスタンプを指定し、省略した場合は現在の時刻が用いられます。関数は成功するとフォーマットされた日付と時刻の文字列を返し、失敗した場合はfalseを返します。

この関数の大きな特徴は、setlocale関数で設定されたロケール(地域や言語の設定)に依存して結果が変化する点です。サンプルコードでは、setlocaleで日本語、英語(米国)、フランス語のロケールを設定し、それぞれの言語圏で一般的な日付時刻の形式で表示される様子を示しています。これにより、同じフォーマット指定でもロケールに応じて「木曜日, 2023年10月26日 14:30」や「Thursday, 10/26/23 02:30 PM」のように異なる表現が可能です。

しかし、strftime関数はPHP 8.1で非推奨となり、PHP 14.0で完全に削除される予定です。そのため、新しいプロジェクトではIntlDateFormatterクラスなど、より現代的で柔軟な代替機能の使用が強く推奨されます。無効なタイムスタンプが与えられるとfalseが返されるため、結果を確認することが重要です。

strftime関数はPHP 8.1で非推奨となり、PHP 14.0で削除される予定です。新規プロジェクトでは、国際化対応に優れるIntlDateFormatterクラスなどの代替機能の使用を強くお勧めします。この関数を利用する際は、setlocale関数で設定するロケール名がOSや環境によって異なるため、複数の候補を試み、設定の成否を必ず確認してください。setlocaleが失敗した場合、意図しない日付形式が表示される可能性があります。また、strftime関数自体も、無効なタイムスタンプなどが渡された場合にfalseを返すことがありますので、戻り値がfalseでないかを常にチェックし、適切なエラーハンドリングを行うことが重要です。

PHP strftime 代替フォーマット処理

<?php

/**
 * strftime 関数の代替となるサンプルコード
 *
 * strftime 関数はロケールに依存するため、非推奨となっています。
 * 代わりに DateTimeオブジェクトと IntlDateFormatter を使用することを推奨します。
 * このサンプルコードでは、DateTimeオブジェクトを使用してstrftimeと同様のフォーマットを行います。
 */
function formatDate(string $format, ?int $timestamp = null): string
{
    $dateTime = $timestamp === null ? new DateTime() : new DateTime('@' . $timestamp);

    // フォーマット文字列をDateTime互換の形式に変換します。
    $formatMap = [
        '%Y' => 'Y',   // 年 (4桁)
        '%m' => 'm',   // 月 (2桁)
        '%d' => 'd',   // 日 (2桁)
        '%H' => 'H',   // 時 (24時間形式, 2桁)
        '%I' => 'h',   // 時 (12時間形式, 2桁)
        '%M' => 'i',   // 分 (2桁)
        '%S' => 's',   // 秒 (2桁)
        '%a' => 'D',   // 曜日 (省略形)
        '%A' => 'l',   // 曜日 (完全形)
        '%w' => 'w',   // 曜日 (数値, 0=日曜, 6=土曜)
        '%j' => 'z',   // 年内の通算日 (0から始まる)
        '%U' => 'W',   // 年内の週番号 (日曜始まり)
        '%W' => 'W',   // 年内の週番号 (月曜始まり) ISO-8601形式
        '%x' => 'Y/m/d', // ロケール依存の日付形式
        '%X' => 'H:i:s', // ロケール依存の時刻形式
        '%c' => 'Y/m/d H:i:s', //ロケール依存の日付と時刻の形式
        '%b' => 'M',   // 月 (省略形)
        '%B' => 'F',   // 月 (完全形)
    ];

    $dateTimeFormat = str_replace(array_keys($formatMap), array_values($formatMap), $format);

    return $dateTime->format($dateTimeFormat);
}

// 使用例
$timestamp = time();
$formattedDate = formatDate('%Y-%m-%d %H:%M:%S', $timestamp);
echo "Formatted date: " . $formattedDate . PHP_EOL;

$formattedDate = formatDate('%A, %B %d, %Y', $timestamp);
echo "Formatted date: " . $formattedDate . PHP_EOL;

PHPのstrftime関数は、指定されたフォーマットに従ってタイムスタンプを整形する関数です。しかし、ロケールに依存した挙動をするため、現在は非推奨となっています。より安全で推奨される代替手段として、DateTimeオブジェクトとIntlDateFormatterを使用する方法があります。

このサンプルコードは、strftime関数の代替として動作するformatDate関数を定義しています。formatDate関数は、strftime関数と同様に、フォーマット文字列とオプションのタイムスタンプを引数に取ります。タイムスタンプが省略された場合は、現在時刻が使用されます。

関数内部では、まずDateTimeオブジェクトを作成します。次に、strftimeで使用されるフォーマット指定子をDateTimeオブジェクトで利用可能なフォーマット指定子に変換するためのマッピングを行います。str_replace関数を使用して、指定されたフォーマット文字列内のstrftime形式の指定子をDateTime形式の指定子に置き換えます。

最後に、変換されたフォーマット文字列を使用してDateTimeオブジェクトのformatメソッドを呼び出し、整形された日付文字列を返します。この関数を使用することで、strftime関数と同様のフォーマットを行うことが可能です。戻り値は整形された日付文字列です。エラーが発生した場合はfalseを返します。サンプルコードでは、具体的な使用例も示しており、様々なフォーマットで日付と時刻を表示しています。

strftime関数はPHPの古い関数で、ロケール(地域設定)に依存した結果を返すため、環境によって表示が変わる可能性があります。そのため、現在は非推奨とされています。

このサンプルコードは、DateTimeオブジェクトを使ってstrftimeの代替となる関数を実装しています。DateTimeはロケールに依存せず、一貫した結果を返します。

注意点として、strftimeの全てのフォーマット指定子をDateTimeがサポートしているわけではありません。サンプルコード内の $formatMap で対応しているフォーマット指定子を確認し、必要に応じて自分で変換ルールを追加してください。

より複雑なロケール対応が必要な場合は、IntlDateFormatterクラスの使用を検討してください。IntlDateFormatterは、より高度な国際化に対応しており、様々なロケールに基づいた日付や時刻のフォーマットが可能です。

strftime 非推奨 PHP date関数で代替する

<?php

/**
 * strftime 関数の代替サンプルコード
 *
 * strftime 関数は非推奨のため、date 関数を使った代替方法を示す。
 */

// 現在のタイムスタンプを取得 (デフォルト)
$timestamp = time();

// フォーマット文字列 (strftime と互換性のあるものを使用)
$format = '%Y-%m-%d %H:%M:%S';

// strftime のフォーマット文字列を date 関数で使える形式に変換
// (例: %Y -> Y, %m -> m, %d -> d, %H -> H, %M -> i, %S -> s)
$dateFormat = str_replace(
    ['%Y', '%m', '%d', '%H', '%M', '%S'],
    ['Y', 'm', 'd', 'H', 'i', 's'],
    $format
);

// date 関数を使ってフォーマットされた日付文字列を取得
$formattedDate = date($dateFormat, $timestamp);

// 結果を出力
echo $formattedDate . PHP_EOL;

// 特定のタイムスタンプを使用する場合
$timestamp = strtotime('2024-10-27 10:00:00'); // 例:2024年10月27日 10時00分00秒
$formattedDate = date($dateFormat, $timestamp);
echo $formattedDate . PHP_EOL;

?>

PHPのstrftime関数は、指定されたタイムスタンプを、ロケールに基づいてフォーマットした文字列を返す関数です。第一引数 $format にはフォーマット文字列を指定し、第二引数 $timestamp にはタイムスタンプを指定します。 $timestamp を省略した場合は、現在のタイムスタンプが使用されます。成功時にはフォーマットされた日付文字列を返し、失敗時にはfalseを返します。

ただし、strftime関数は非推奨となっており、代わりにdate関数を使用することが推奨されます。 サンプルコードでは、strftime関数の代替としてdate関数を使用する方法を示しています。

具体的には、まずtime()関数で現在のタイムスタンプを取得し、strtotime()関数で特定の日時のタイムスタンプを取得します。次に、strftimeで使用していたフォーマット文字列を、str_replace関数を使ってdate関数で使用できる形式に変換します。例えば、%YYに、%mmに変換します。最後に、date関数に変換後のフォーマット文字列とタイムスタンプを渡すことで、フォーマットされた日付文字列を取得できます。date関数は、第二引数に指定されたタイムスタンプを、第一引数に指定された形式でフォーマットした文字列を返します。サンプルコードでは、date関数と文字列置換を組み合わせることで、strftime関数と同様の機能を実現しています。

strftime関数は非推奨であり、このサンプルコードは代替としてdate関数を使用しています。strftimeのフォーマット文字列をdate関数用に変換する必要があります。主な変換例として、%YY%mm%dd%HH%Mi%Ssにそれぞれ対応します。全てのstrftimeフォーマットがdate関数で利用できるわけではないため、必要に応じて調整してください。タイムゾーンの設定も重要です。date_default_timezone_set()関数で適切なタイムゾーンを設定することを推奨します。strtotime関数でタイムスタンプを生成する場合、入力文字列の形式に注意してください。予期しない結果になる可能性があります。

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