Thread Rating:
  • 381 Vote(s) - 2.69 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.)
#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}
                      }

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1276')