header

PHPでRFC3339形式のタイムスタンプを表示する

(1/2)

インターネットのコンテンツはワールドワイドで参照できる。したがって、タイムスタンプの表示が必要なときは、タイムゾーンを明示――クライアントのある地域の現地時間なのか、それともサーバのある地域の現地時間なのか、はたまた世界標準時なのか――する必要がある。

そこで今回は、与えた日時をインターネットの標準形式であるRFC3339形式で表示するプログラムを紹介する。

0001: <?php
0002: // ここからPHPプログラム =======================================================
0003: /** RF3339.php
0004:  * RFC3339形式のタイムスタンプを表示する
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     1.0  2005/06/26
0008:  *
0009: */
0010: /**
0011:  * UNIXタイムスタンプからRFC3339 UTC タイムスタンプを返す
0012:  * @param   int $unix UNIXタイムスタンプ,Unix epoch(1970年1月1日 00:00:00 GMT))からの通算秒
0013:  * @return  RFC3339 UTC
0014: */
0015: function unix2utc($unix) {
0016:     return (gmdate("Y-m-d", $unix) . "T" . gmdate("H:i:s", $unix) . "Z");
0017: }
0018: 
0019: 
0020: /**
0021:  * RFC3339 UTC タイムスタンプをローカルのタイムスタンプに変換する
0022:  * @param   int $ UNIXタイムスタンプ,Unix epoch(1970年1月1日 00:00:00 GMT))からの通算秒
0023:  * @param   String $utc RFC3339 UTCタイムスタンプ
0024:  * @param   int tz_hour UTCと地方時の差(時間)
0025:  * @param   int tz_min UTCと地方時の差(分),省略可能
0026:  * @return  ローカルのタイムスタンプ(RF3339表記)/NULL=エラー(入力文字列が規定外など)
0027: */
0028: function utc2local() {
0029:     //可変長変数を使う
0030:     if (func_num_args() < 2)    return NULL;
0031:     $utc = func_get_arg(0);
0032:     $tz_hour = func_get_arg(1);
0033:     $tz_min = (func_num_args() >= 3) ? func_get_arg(2) : (0);
0034: 
0035:     if (preg_match("/[0-9]+-[0-9]+-[0-9]+T[0-9]+:[0-9]+:[0-9]+Z/", $utc) == 1) {
0036:         list($year, $month, $day, $hour, $minuite, $second) = sscanf($utc, "%d-%d-%dT%d:%d:%dZ");
0037:     } else if (preg_match("/[0-9]+-[0-9]+-[0-9]+T[0-9]+:[0-9]+Z/", $utc) == 1) {
0038:         list($year, $month, $day, $hour, $minuite) = sscanf($utc, "%d-%d-%dT%d:%dZ");
0039:         $second = 0;
0040:     } else if (preg_match("/[0-9]+-[0-9]+-[0-9]+T[0-9]+Z/", $utc) == 1) {
0041:         list($year, $month, $day, $hour, $minuite) = sscanf($utc, "%d-%d-%dT%dZ");
0042:         $minuite = 0;   $second = 0;
0043:     } else if (preg_match("/[0-9]+-[0-9]+-[0-9]+Z/", $utc) == 1) {
0044:         list($year, $month, $day, $hour, $minuite) = sscanf($utc, "%d-%d-%dZ");
0045:         $hour = 0;  $minuite = 0;   $second = 0;
0046:     } else {
0047:         return NULL;    //UTC書式エラー
0048:     }
0049: 
0050:     $tt = mktime($hour + $tz_hour, $minuite + $tz_min, $second, $month, $day, $year);
0051: 
0052:     $s = date("Y-m-d", $tt) . "T" . date("H:i:s", $tt);
0053:     $f = ($tz_hour < 0) ? "-" : "+";
0054: 
0055:     return sprintf("%s%s%02d:%02d", $s, $f, abs($tz_hour), $tz_min);
0056: }
0057: 
0058: 
0059: // メインプログラム ============================================================
0060:     $utc = unix2utc(time());            //内蔵時計の日時をUTCに変換する
0061:     $local = utc2local($utc, 9);        //JST = UTC + 09:00
0062: 
0063:     printf("<pre>\n");
0064:     printf("UTC : %s<br />\n", $utc);
0065:     printf("JST : %s<br />\n", $local);
0066:     printf("</pre>\n");
0067: ?>
0068: 

プログラムを実行する