Post Reply 
 
Thread Rating:
  • 112 Votes - 2.8 Average
  • 1
  • 2
  • 3
  • 4
  • 5
"9999/12/31"のDateTimeへの変換
11-12-2015, 03:45 PM (This post was last modified: 11-12-2015 03:51 PM by kay.)
Post: #1
"9999/12/31"のDateTimeへの変換
業務ルールで大きな日付が入ってくる可能性がある箇所では
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}
                      }
Find all posts by this user
Quote this message in a reply
Post Reply 

Forum Jump:


User(s) browsing this thread:
1 Guest(s)