11-12-2015, 03:45 PM
業務ルールで大きな日付が入ってくる可能性がある箇所では
DateTime値にタイムゾーンの設定が必要というのを知りましたので、
備忘録として残させていただきます。
文字列からDateTime型の値を得る際に、9999/12/31のような大きい値を取った場合
DateTime のコンストラクタで作成したインスタンスは data にアクセスすると DateTimeException が発生し、
DateTime.date ファクトリで作成したインスタンスでは問題が発生しませんでした。
よくよくリファレンスを見てみると、コンストラクタとファクトリではDateTime.zone に設定される初期値が異なり、
コンストラクタは DateTimeZone.local
ファクトリは DateTimeZone.utc
をセットするとのことで、これによって動作が異なっているようでした。
DateTimeZone.local は DateTimeZone.mode (DateTimeZoneMode.local) の制限により、
DateTimeData.epoch-simple (1970-01-01 00:00:00 +0000) から 2038/01/19 (所謂2038年問題) までの
日付のみ扱えるとのことで、これが原因でエラーが発生していたようです。
DateTime値にタイムゾーンの設定が必要というのを知りましたので、
備忘録として残させていただきます。
文字列からDateTime型の値を得る際に、9999/12/31のような大きい値を取った場合
DateTime のコンストラクタで作成したインスタンスは data にアクセスすると DateTimeException が発生し、
DateTime.date ファクトリで作成したインスタンスでは問題が発生しませんでした。
よくよくリファレンスを見てみると、コンストラクタとファクトリではDateTime.zone に設定される初期値が異なり、
コンストラクタは DateTimeZone.local
ファクトリは DateTimeZone.utc
をセットするとのことで、これによって動作が異なっているようでした。
DateTimeZone.local は DateTimeZone.mode (DateTimeZoneMode.local) の制限により、
DateTimeData.epoch-simple (1970-01-01 00:00:00 +0000) から 2038/01/19 (所謂2038年問題) までの
日付のみ扱えるとのことで、これが原因でエラーが発生していたようです。
Code:
def dt:DateTime =
{DateTime
zone = {DateTimeZone
mode = DateTimeZoneMode.utc,
utc-offset-minutes = {local-offset}
},
year = {year-of ymd-str}.to-int64},
month = {{month-of ymd-str}.to-int},
day = {{day-of ymd-str}.to-int}
}