◆ご質問◆
DateTimeについてCurlドキュメントを拝見したのですが、
記載されている仕様について、
以下、いろいろ書きますが認識に誤りなどありましたら
ご指摘ください。
①ローカルタイムゾーンにおける制約について
DateTimeのzoneを指定しない場合、
ローカルタイムゾーンがデフォルトとなるようですが、
この時、日付範囲の制約が発生する仕様になっているようです。
※1970-01-01 00:00:00.000000 +0000 から
2038-01-19 03:14:07.000000 +0000
ローカルタイムゾーン以外に設定すると、
この制約が無くなることは確認しました。
Curlでは無限の範囲と制度で日付と時刻を表すことができるにも
関わらず、こういった制限があるのはなぜでしょうか。
②ゾーン指定をすることによる影響について
上記①のことから、
zoneを指定して回避しようと考えました。
この時、ゾーンに「UTC」を設定するとすると、
日本時間を扱っている上では、正しい時間とはならないので、
日付を表す文字列に「+0900」を追加するか等も考えています。
このゾーンについて、UTCまたはその他のゾーンが設定されていると、
ローカルタイムゾーンと比べて、
DateTime周辺のAPIの結果に大きな違いが出るのでしょうか。
例えば、
DateTimeのコンストラクタに日付とUTCでゾーン設定した時、
その後のAPIで日付取得した時に自動的に日本時間(+9時間)として
取得されるなどあるとUTCは使えないと判断します。
③まとめ
上記①②を踏まえ、
Curlでシステム開発をする際、
DateTimeは通常どのように扱ってらっしゃるのでしょうか。
<1> 1970年~2038年の範囲を超えた日付を扱ったことが無いので
ローカルタイムゾーンのまま。
<2> システム導入先の国に合わせてタイムゾーンを指定。
<3> UTCで決め打ち。
いずれかになるかと思うのですが。
◆回答◆
①について
Curlは時刻を内部的に「UNIX時間」として扱っています。
また、その値を32ビットで扱っており、その最大値が2147483647となります。
(これが2038年1月19日3時14分7秒となります。)
この値を超えるとオーバーフローし誤作動する可能性があります。
このようなことから制約があります。
②について
{DateTime
year = 2009,
month = 6,
day = 3,
hour = 14,
minute = 8,
second = 14,
zone = {DateTimeZone mode = DateTimeZoneMode.utc, utc-offset-minutes = 540} }
としてDateTimeを設定すれば
2009-06-03 14:08:14.000000 +0900
として取得できます。
③について
アプリケーションの用途によって扱い方が
変わるかと思います。
例えば、
<1>ならばタイムゾーンが一つであるような国で完結するようなシステム。
(日本国内のみで使用される)
<2>なら韓国で国内で使用されるようなシステム。
<3>複数のタイムゾーンの国で使用され、その使用国間でコミュニケーションするようなシステム。
(日本、米国、中国で使用される)