Apexの日付/時間の扱い

SalesforceのApexで日時を扱う時、見た目の表記と実際のデータ(メモリやデータベースに格納される日時)のTimezoneを常に意識する必要がある。

String txt=’2018-12-01 01:23:45′;
Datetime dt=Datetime.valueOf(txt);
System.debug(dt);

とやると、ログには「2018-11-30 01:23:45」が出力される。
これはバグでもなんでもなくて、txtに格納された日時にTimezoneが指定されていなかったのでシステムがGMTとして扱い、GMTでの2018-12-01 01:23:45としてメモリに格納、それをログに取り出す際、シリアル値を日付表記に変換する過程でローカルタイム(JP=GMT+0900 )にするために9時間がマイナスされてしまっている。

よく同様の問題を扱うブログ等の記事を見ると、9時間を加算したりvalueOfgmtで処理したりするパターンを見かけるが、それを行うと最初の表記上の時刻(時間軸上の絶対的な位置)と実際にメモリやDBに格納される時刻が一致しないことになる。

なので、Apexやデータローダで日付を扱うときは、その日付がどのTimezoneなのかを常に考慮しておく必要がある。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA