なるようにしかならん

そういうことです

時間に関するあれこれをメモする

協定世界時UTC(Universal Time, Coordinated)

セシウム原子時計が刻む国際原子時(TAI)をもとに、天文学的に決められる世界時(UT1)との差が0.9秒未満となるよう国際協定により人工的に維持されている世界共通の標準時である。具体的には、世界時との差が0.9秒以内になるように閏秒を挿入して維持している。世界各地の標準時はこれを基準として決めている。例えば、日本標準時JST)は協定世界時より9時間進んでおり、「+0900(JST)」のように表示する。

(via 協定世界時 - Wikipedia

グレゴリオ暦

1年を365日とするが、400年間に97回の閏年を置いてその年を366日とする。これによって、400年間における1年の平均日数を365.2425日とすることがグレゴリオ暦の本質である。

(via グレゴリオ暦 - Wikipedia)

java.util.Date

Date クラスは、UTC (Universal Coordinate Time) を反映することを意図していますが、Java 仮想マシンのホスト環境によってはこれを正確に行えない可能性があります。ほとんどすべての最近のオペレーティングシステムは、あらゆる場合において 1 日 = 24 × 60 × 60 = 86400 秒と仮定しています。しかし、UTC においては毎年約 1 回か 2 回「うるう秒」と呼ばれる余分な秒が発生します。うるう秒は常にその日の最後の秒として追加され、それは常に 12 月 31 日かまたは 6 月 30 日です。たとえば、1995 年の最後の分は、うるう秒の追加により長さが 61 秒でした。ほとんどのコンピュータのクロックは、うるう秒の違いを反映できるほど正確ではありません。

(via Date (Java Platform SE 6)


引用元によって微妙に言い回しがちがうのは気にしない方向で。
Date#toString()がTimeZoneを意識した出力になる理由が知りたいのでもう少し調べます。

(追記)
TimeZoneクラスのsetDefaultZone()の中で"user.country"の情報をシステムプロパティから取得して

private static native String getSystemTimeZoneID(String javaHome, String country);

ってので文字列のzoneIDを取得、それをkeyにして/lib/zi以下のZoneInfoFile(?)を
探してきて、、、、ようやくタイムゾーンの取得が終わります。

あとはそのタイムゾーンと、fastTime(Dateオブジェクトをnewするときに設定するミリ秒)で
内部的にcalendarクラス(※)を作成して、あとはformat整えて出力、って感じ。

(※言い方が正しくないかもなので、自分の環境では" sun.util.calendar.BaseCalendar.Date "クラスです)

sun.util.calendarパッケージが沢山出てくるけど、、、もうちょい。。。