NeverBlog::Likk::Unexistable;

見なかったことにして下さい

ColdFusion で日付処理

元ネタ:誰もが一度は陥る日付処理。各種プログラミング言語におけるDateTime型/TimeStamp型の変換方法のまとめ - Yuta.Kikuchiの日記
ColdFusion がないので書いてみた。
って、「普通ねえよ」とか、「ColdFusionって何やねん!」とか、「うわーまだ生きてたのかー。」とか反応が普通だろうけどそこはスルー。
「ありがとー」、「たすかった」、「これを探してた」とかいう人は多分居ないけどそれも気にしない。


もう3年ぐらいちゃんと書いてなくて記憶を呼び起こしながら書いた。一応、動作チェック済み。
たまに、こういうことをすると頭の体操になる。

<cfset localDate = now()>
<cfset utcDate   = DateConvert("Local2utc", localDate)>
<cfset epoch     = DateDiff("s", "January 1 1970 00:00", utcDate)>
<cfset utime     = 1371729285>
<cfoutput>
    Local Date: #localDate# <br>
    UTC Date: #utcDate# <br>
    Epoch: #epoch# <br>
    Time :#DateAdd("s", utime ,DateConvert("utc2Local", "January 1 1970 00:00"))# <br>
    yymmdd24hmiss: #DateFormat(localDate, "yyyy/MM/dd")# #TimeFormat(localDate, "HH:mm:ss")#
</cfoutput>

簡単に解説するけど、段々やることが面倒臭くなります。

DateTime
now()

普通にnow関数を呼ぶだけ。

DateTime(UTC)
DateConvert("Local2utc",now())

DateConvert でローカル時間からUTCに変えてあげる。

DateTime -> Unixtime
DateDiff("s", "January 1 1970 00:00", DateConvert("Local2utc",now()))

epoch秒はDateTimeには無い情報なので、ローカル時間をUTCに変更したうえ、epoch0秒である1970/01/01 00:00:00 と秒単位で差分をだしてepoch秒を算出する。面倒臭い。

Unixtime -> DateTime
DateAdd("s", 0 ,DateConvert("utc2Local", "January 1 1970 00:00"))

上記の DateAddの第二引数0にあたるところに変換したいepoch秒を指定します。
DateTimeからUnixtimeを計算したのと同じ要領でその逆をしてあげます。

yyyy/mm/dd 24h:mi:ss の表示
DateFormat(now(), "yyyy/MM/dd")
TimeFormat(now(), "HH:mm:ss")

now() をそれぞれDateFormatとTimeFormatを使って日付と時刻を表示します。
日付時刻両方を上手く出すDateTineFormatというのもありますが、CFMXのバージョン10より前にはそんな関数在りませんので、別々にやってつなぐ必要があります。くそ面倒臭いですね。
CFMX9以下の場合、ColdFusion DateTimeFormat() Utility Function で紹介されてるようなfunctionを実装すればできなくも無いです。