文字列をDatetime型に変換する時の注意点

apexにて、文字列からDatetime型に変更した際の注意点。

例えば、日本で作業してる場合は、GMT+9となり、標準時より9時間プラス、となる。
文字列からdatetime型に変更する際にはいくつか方法があるが、valueOfが簡単。
しかし例えば以下のようにすると意図しない時間が帰って来てしまう

String test_str = '2014-12-1 05:30:18';
Datetime test_dt = Datetime.valueOf(test_str);
System.debug(test_dt);

//出力
// 2014-11-30 20:30:18

特に顕著な例だけど、月が変わってしまっている。
なぜかというと、Datetime型に変換する際に、(なぜか)GMTが考慮されて、標準時に戻して出力されるよう。
日本は+9時間なので、標準時は-9時間。
なので、指定した時間よりも9時間マイナスされた日時が返却される仕様。
このため、日付が変わり、その結果、月も変わってしまったという現象が起こる。
それを回避するにはちゃんとメソッドが用意されていて、valueOfGmtを使う。
これだと、設定しているGMTを使って(要するに入力された時間そのまま)、Datetimeを作成してくれる。

String test_str = '2014-12-1 05:30:18';
Datetime test_dt = Datetime.valueOfGmt(test_str);
System.debug(test_dt);

//出力
// 2014-12-1 05:30:18

月まで変わると結構クリティカルだと思うので、要注意。

   このエントリーをはてなブックマークに追加