読者です 読者をやめる 読者になる 読者になる

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

今回はここまで。もうちょい調べないとですね。

環境

Java7 (sun-jdk-1.7.0_03)
C (gcc-4.3.4)

http://ideone.com/ を利用しました。

何か間違いがあれば指摘お願いします!