内部的な日時の処理は、すべて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
現在の日時を、Unixタイムスタンプへ変換できます。
int time ( void )PHP: time - Manual
現在の日時とは、スクリプトが実行される環境 (サーバ) の日時です。
指定日時を、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
と出力されます。
文字列 (英文形式) を、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
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 | '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 |
※1 これはISO-8601に適合していません。しかし時差部分を修正しRFC 3339と同じ書式とすれば、ISO-8601拡張形式にはなります。
※2 JavaScriptへ渡すことを想定するならば、RFC 2822にすべきです。
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 );
ロケールの設定に従って、日時を書式化して出力できます。
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
タイムゾーンでは、地域による時差の問題に対処します。
タイムゾーンが異なると、異なる日時が返されます。つねに同じ日時で処理するにはタイムゾーンを明示するか、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