日時

Unixタイムスタンプへの変換

内部的な日時の処理は、すべてUnixタイムスタンプ (UNIX時間) で行われます。よって日時に関する処理が必要ならば、まずはUnixタイムスタンプへと変換します。なおUnixタイムスタンプは、タイムゾーンの影響を受けません。

Unixタイムスタンプは1970/01/01からの経過秒数です。

echo date( DATE_ATOM, 0 ); // 1970-01-01T09:00:00+09:00
echo date( DATE_ATOM, 1 ); // 1970-01-01T09:00:01+09:00

echo strtotime( '1970/01/01' );          // -32400
echo strtotime( '1970/01/01 09:00:00' ); // 0
echo strtotime( '1970/01/01 10:00:00' ); // 3600

time

現在の日時を、Unixタイムスタンプへ変換できます。

int time ( void )
PHP: time - Manual

現在の日時とは、スクリプトが実行される環境 (サーバ) の日時です。

時間とUnix時間の相互変換ツール

mktime

指定日時を、Unixタイムスタンプへ変換できます。

int mktime (
    [ int $hour = date("H")    // 時
    [, int $minute = date("i") // 分
    [, int $second = date("s") // 秒
    [, int $month = date("n")  // 月
    [, int $day = date("j")    // 日
    [, int $year = date("Y")   // 年
    [, int $is_dst = -1        // サマータイムの指定 (PHP 5.1.0で廃止)
    ]]]]]]] )
PHP: mktime - Manual

引数は、時:分:秒 月/日/の順になっています。これは日本の書式とは異なるため、注意が必要です。

たとえば、

echo date( 'Y/m/d H:i:s', mktime( 1, 2, 3, 4, 5, 6 ) );

とすると、

2006/04/05 01:02:03

と出力されます。

strtotime

文字列 (英文形式) を、Unixタイムスタンプへ変換できます。

int strtotime ( string $time [, int $now = time() ] )
PHP: strtotime - Manual

$timeには、サポートする日付と時刻の書式 - Manualにあるさまざまな形式で日時を指定できます。

echo date( DATE_RFC822, strtotime( 'now', 0 ) );            // Thu, 01 Jan 70 09:00:00 +0900
echo date( DATE_RFC822, strtotime( '+1 year', 0 ) );        // Fri, 01 Jan 71 09:00:00 +0900

echo date( DATE_RFC822, strtotime( '10 September 2005' ) ); // Sat, 10 Sep 05 00:00:00 +0900
echo date( DATE_RFC822, strtotime( '2005/9/10' ) );         // Sat, 10 Sep 05 00:00:00 +0900

日時を表す文字列への変換

date

Unixタイムスタンプの日時を、書式化された文字列で取得できます。

string date ( string $format [, int $timestamp = time() ] )
PHP: date - Manual

$timestampを指定しないときはtime()の戻り値が使用されるため、現在の日時を書式化して取得できます。

$formatには書式文字を使用して、'Y/m/d H:i:s'のように指定します。この書式を表す文字列が定義済みの定数として用意されているため、それを利用すると簡単です。

定義済み定数
定数 規格 書式 出力例
DATE_ATOM Atom 'Y-m-d\TH:i:sP' 2005-08-15T15:52:01+00:00
DATE_W3C W3C
DATE_RFC3339 RFC 3339
DATE_ISO8601 ISO-8601※1 'Y-m-d\TH:i:sO' 2005-08-15T15:52:01+0000
DATE_RFC822 RFC 822 'D, d M y H:i:s O' Mon, 15 Aug 05 15:52:01 +0000
DATE_RFC1036 RFC 1036
DATE_RSS RSS 'D, d M Y H:i:s O' Mon, 15 Aug 2005 15:52:01 +0000
DATE_RFC1123 RFC 1123
DATE_RFC2822 RFC 2822 ※2
DATE_RFC850 RFC 850 'l, d-M-y H:i:s T' Monday, 15-Aug-05 15:52:01 UTC
DATE_COOKIE HTTP Cookies Tuesday, 16-Aug-05 00:52:01 JST
PHP: DateTime - Manual

※1 これはISO-8601に適合していません。しかし時差部分を修正しRFC 3339と同じ書式とすれば、ISO-8601拡張形式にはなります。

※2 JavaScriptへ渡すことを想定するならば、RFC 2822にすべきです。

gmdate

date()と基本的に同じですが、日時をグリニッジ標準時 (Greenwich Mean Time : GMT) で出力する点が異なります。

string gmdate ( string $format [, int $timestamp = time() ] )
PHP: gmdate - Manual
date_default_timezone_set( 'Asia/Tokyo' );
echo date( DATE_RFC822, 0 );   // Thu, 01 Jan 70 09:00:00 +0900
echo gmdate( DATE_RFC822, 0 ); // Thu, 01 Jan 70 00:00:00 +0000

date_default_timezone_set( 'America/New_York' );
echo date( DATE_RFC822, 0 );   // Wed, 31 Dec 69 19:00:00 -0500
echo gmdate( DATE_RFC822, 0 ); // Thu, 01 Jan 70 00:00:00 +0000

これを利用して、グリニッジ標準時に日本の時差 (+9時間) を加算すると、タイムゾーンの設定によらず日本時間で処理できます。

echo gmdate( DATE_RFC822, $timestamp + 3600 * 9 );

strftime

ロケールの設定に従って、日時を書式化して出力できます。

string strftime ( string $format [, int $timestamp = time() ] )
PHP: strftime - Manual

Windowsでは非対応の書式文字を渡すとE_WARNINGを発生するとドキュメントにありますが、PHP 5.3では何も警告は発せられず、空文字が返されます。

date()とは書式文字が異なる点に、注意が必要です。

echo date    ( 'Y/m/d H:i:s', 0 );       // 1970/01/01 09:00:00
echo strftime( '%Y/%m/%d %H:%M:%S', 0 ); // 1970/01/01 09:00:00

ロケールはsetlocate()で設定できます。

string setlocale ( int $category , array $locale )
PHP: setlocale - Manual

$localeに指定可能な名前は、ISO 639-2 Language Code Listに一覧があります。

ロケールの設定はプロセスごとに適用されるため、マルチスレッドの環境では他のスレッドへロケールの変更が影響することがあります。

実際の出力は、以下のようになります。

$format = '%A %#d %B %Y %X';

setlocale( LC_TIME, 'Japanese' );
echo strftime( $format, 0 ); // 木曜日 1 1月 1970 9:00:00

setlocale( LC_TIME, 'jpn' );
echo strftime( $format, 0 ); // 木曜日 1 1月 1970 9:00:00


setlocale( LC_TIME, 'English' );
echo strftime( $format, 0 ); // Thursday 1 January 1970 9:00:00 AM

setlocale( LC_TIME, 'Spanish' );
echo strftime( $format, 0 ); // jueves 1 enero 1970 9:00:00

タイムゾーン (time zone)

タイムゾーンでは、地域による時差の問題に対処します。

タイムゾーンが異なると、異なる日時が返されます。つねに同じ日時で処理するにはタイムゾーンを明示するか、gmdate()を使用します。

タイムゾーンの指定は、設定オプションで行う方法と、スクリプトごとに行う方法の2つがあります。

設定オプションでの指定

設定オプションに、date.timezoneディレクティブの記述を追記します。

date.timezone = "Asia/Tokyo"
date.timezone - PHP: 実行時設定 - Manual

スクリプトでの指定

date_default_timezone_set()で、スクリプトで使用する既定のタイムゾーンを指定できます。

bool date_default_timezone_set ( string $timezone_identifier )
PHP: date_default_timezone_set - Manual
date_default_timezone_set( 'UTC' );
echo date( DATE_RFC822, 0 ); // Thu, 01 Jan 70 00:00:00 +0000

date_default_timezone_set( 'Asia/Tokyo' );
echo date( DATE_RFC822, 0 ); // Thu, 01 Jan 70 09:00:00 +0900

逆に現在のタイムゾーンの設定は、date_default_timezone_get()で確認できます。

日時の演算

Unixタイムスタンプはただの数値のため、加減算で日時を変更したり、複数の日時を比較したりできます。

$timestamp = strtotime( '1970/01/01 09:00:00' ); // 0
$timestamp += 3600;                              // 3600

echo date( 'Y/m/d H:i:s', $timestamp ); // 1970/01/01 10:00:00