Groovy の Date クラスについて勘違いしていたこと
先日の Yokohama.groovy で Date クラスがイケてないなーということを感じていましたが、Java をよく知らないことによる勘違いがありました。
コメントでも頂いたように GDK は JavaAPI を互換性を保持したまま拡張したものであり、不便さも含めて引き継いでいるので、Groovy の Date がイケてないのではなく、Java の Date がイケてないということのようです。
The Groovy programming language - Groovy APIs
Date (Java Platform SE 7 b99)
しかも JavaAPI仕様では、年月日を指定するものはDeprecated となっていました。
この辺の経緯については http://www.coppermine.jp/documents/programming/2011/12/java-util-date.html に非常によくまとまっていて分かりやすかったです。
色々複雑なんですね…
ここで終わってもよかったのですが、興味本位で Java と元になったらしい C の日付関数について簡単な確認をしてみました。
Java で確認
import java.util.Date; class Hoge { public static void main(String[] args){ Date d = new Date(0, 0, 0); System.out.println(d); } }
Sun Dec 31 00:00:00 GMT 1899
Groovy で確認した時と同じですね。
C で確認
#include <stdio.h> #include <time.h> int main() { time_t timer; struct tm t = {0}; struct tm *pt; timer = mktime(&t); pt = localtime(&timer); printf("%4d %02d %02d\n", pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday); return 0; }
1969 12 31
あれ?UNIX 時間っぽい?
#include <stdio.h> #include <time.h> int main() { time_t timer; struct tm t = {0}; struct tm *pt; t.tm_year = 100; timer = mktime(&t); pt = localtime(&timer); printf("%4d %02d %02d\n", pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday); return 0; }
1999 12 31
うーん?
初期状態 (すべてゼロ)だと UNIX 時間の起点 1970 年 1 月 1 日の前日になるのに 100を指定すると 1900 年を起点とした日付になる?
挙動がよくわかりません。
#include <stdio.h> #include <time.h> int main() { time_t timer; struct tm t = {0}; struct tm *pt; t.tm_year = 70; t.tm_mday = 1; timer = mktime(&t); pt = localtime(&timer); printf("%4d %02d %02d\n", pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday); return 0; }
コンパイルエラーになった…
コメント頂いた通り、typo でした…
恥ずかしー。
結果はこちら。
1970 01 01
今回はここまで。もうちょい調べないとですね。