日付関連文字列変換 関数一覧


class datetimeString ( lib/datetime.php )

意外に厄介なのが日付の表示関係です。日付のフォーマットは様々な形式があり、このため、日付の取扱いはかなり面倒になっています。
とりわけ、関数には日本の日付表示を取り扱うものがなく、英語表記との変換もなかなか厄介です。
このクラスは、よく使ういくつかの形式間での表記を変換します。
また、期間計算のために内部で計算可能な UNIX タイムスタンプとして補完します。


英語表記は 11 Jun 2002 のように日付は数字、次に月を3文字の短縮形で続け、最後に年が来ます。いわゆる 2000 年問題がありますので年の2桁表現はこのクラスでは扱いません。
厄介なことにこの形式は米国式で、ヨーロッパでは Jun 11 2002 のように並びが変わります。FreeBSD のファイルのタイムスタンプはこの形式です。

 

一方、iso8601 という規格では 2002-6-11 のように数字で年、月、日の順に並びます。で、日本ではやはり、2002年6月11日 のように表示させたいですね。というわけで、こうした日付の変換は予想外に厄介です。

 

メールの処理などでは、更にタイムゾーンを考慮する必要があります。PHP の関数はマシンのローカルタイムとグリニッジ標準時の変換しかありませんから、様々なタイムゾーンが混在するメールなどでは大変苦労することになります。

このクラスは、こうした各種表現を簡潔に利用する事を目的にしました。

各種変換は、以上の3通りの形式を判別して任意の方式へ変換します。
日付の照合や計算などは PostgreSQL で処理できることが多いので、このクラスでは扱いません。

 

日付の計算に関しては、2023年問題というものもあります。これは UNIX の時間が 1970年を起点とした32ビット数値の秒数で表されているため、2023年以降が表現できない、という問題です。現状で、UNIX の標準関数(それをラップした PHP関数)ではこの問題を避けられません。

 

ただ、PostgreSQL では 64 ビット値が使われるため、非常に長い年月を取り扱うことができます。例えば、江戸時代の年代やギリシャ、ローマの年表などと期間計算を行うことができます。

 

現在の所、タイムゾーンの変換では閏年などの関係で一旦 UNIX タイムに変換して補正を行っているので、2023年問題に抵触します。
ただ、電子メールなど、現在に近い場面での利用が多いと判断し、この方法を取っています。

変換については、複雑なフォーマット指定は一切行わず、使用頻度の高い物に絞っています。必要な形式が必要なときは、set() 関数で一旦、各単位に分解して収納しますから、クラスを継承して組み立てて下さい。


 

set
01.フォーマット判定して分解収納
set( $str='' )
判定した日付フォーマット
l  現在の日付
u  unix タイムスタンプ
a apache 形式
e 英式
j 和式
i iso 8601 形式
書式判定出来なかったときは false
日付文字列を年、月、日、時、分、秒、タイムゾーンに分解して収納します。日付文字列の最低限必要なのは月と日で 省略できません。
文字列を省略したときは実行時の日付時刻、数値のみの場合は UNIX タイムの値として判別します。
分解後、日付の妥当性をチェックしますが、年を省略したときは実行時の年と解釈します。妥当性のチェックに失敗すると false が返ります。

妥当性チェックでは、PHP の checkdate() 関数に従います。

    * 年は 1 から 32767 まで
    * 月は 1 から 12 まで
    * 日はその月に応じた範囲内(閏年は判定されます)

入力可能な形式は以下の通りで、それに応じた識別文字が返ります。

l  引数が省略され、現在のローカルな日付時刻がセットされた
u  UNIX タイムの値を受け取り、ローカルな日付としてセット
a  Apache のログで用いられる形式 11/Jun/2002/00:00:00 +0900
e  洋式:11 Jun 2002 00:00:00, 又は Jun 11 2002 00:00:00
i  iso8601 形式:2002-6-11 00:00:00+0900
j  和式:2002年6月11日0時0分0秒
$str 日付文字列(省略時は現在の日付情報)

timestamp
02.UNIX タイムスタンプで取得
timestamp()
UNIX タイムスタンプ(int)
前もって set() 関数を実行しておく必要があります。
UNIX タイムスタンプは 1970 年1月1日からの経過秒数ですが、2023 年以降は表現出来ないことに注意が必要です。
UNIX 系のシステムでは 1970 年1月1日以前も表現できます。

jp
03.和式へ変換
jp( $time='' )
和式日付の文字列
前もって set() 関数を実行しておく必要があります。
各単位を 2002年6月11日0時0分0秒 の和式文字列へまとめて返します。
$time を指定しないと日付のみの表示になります。
単位を 1 にしたときは時と分を付けます。2 にしたときは更に秒を付けます。現在、この関数ではタイムゾーンは付けません。
set() 関数で年を省略したときは、表示上も省略します。
時、分、秒を省略したときは 0 になります。
$time 0: 日付のみ(省略時) 1: 時分まで 2: 秒まで

us
04.英式へ変換
us( $time='' )
英式日付の文字列
前もって set() 関数を実行しておく必要があります。
各単位を 11 Jun 2002 00:00:00 の洋式文字列へまとめて返します。
$time を指定しないと日付のみの表示になります。
単位を 1 にしたときは時と分を付けます。2 にしたときは更に秒を付けます。3 の時はタイムゾーンを +0900 の形式で付け加えます。
set() 関数で年を省略したときは、表示上も省略します。
時、分、秒を省略したときは 0 になります。
$time 0: 日付のみ(省略時) 1: 時分まで 2: 秒まで

iso
05.iso8601へ変換
iso( $time='' )
iso8601日付の文字列
前もって set() 関数を実行しておく必要があります。
各単位を 2002-6-11 00:00:00 の iso8601 形式文字列へまとめて返します。
$time を指定しないと日付のみの表示になります。
単位を 1 にしたときは時と分を付けます。2 にしたときは更に秒を付けます。3 の時はタイムゾーンを +09:00 の形式で付け加えます。 この時、秒数との間にスペースを空けません。
set() 関数で年を省略したときは、表示上も省略します。
時、分、秒を省略したときは 0 になります。
$time 0: 日付のみ(省略時) 1: 時分まで 2: 秒まで

gmt
06.ローカルから gmt へ変換
gmt( $tz='' )
なし
ローカル時間からグリニッジ標準時へ変換します。
ローカル時間は set() 関数でセットされたタイムゾーンに従いますが、$tz で指定すれば優先します。いずれも指定されていないときは +0900 と解釈します。
タイムゾーンは JST 等の文字、+0900、+09:00 のいずれかの形式を受け付けます。
終了時、$loc に -00:00 のタイムゾーンが設定されます。
$tz タイムゾーン指定(省略時は JST と見なす)

local
07.gmt からローカルへ変換
local( $tz='' )
なし
 内部値をグリニッジ標準時と解釈し、引数 $tz で指定したタイムゾーンに従って変換します。従って、set() 関数では正しくグリニッジ標準時をセットする必要があります。
タイムゾーンは JST 等の文字、+0900、+09:00 のいずれかの形式を受け付けます。
終了時、$loc に $tz のタイムゾーンが設定されます。
$tz タイムゾーン指定(省略時は JST)


Copyright © 2001-2005, Hidetomo Harikawa, All rights reserved

△ページ先頭△