📝

JDK1.0 でありますまいか

2021/02/14に公開

JDK 1.0 (Java 1.0.2) を入手したので、GitHub に置いておきました。 とのこと。

https://github.com/YujiSoftware/JDK1.0/blob/master/src/java/util/Date.java

でjava.util.Date が読めるということ。

java.util.Date―その悲劇と歴史

java.util.Dateは、JDK1.1の時に改訂されて以来、実はまだ大きな改訂がありません。Java SE 5.0のときに@Deprecatedアノテーションが導入されていますが、それもほんの些細なことです。Java SE 8ではDate and Time APIとの相互運用性のためのメソッドが追加されましたが、JDK1.1の時に比べれば小規模な改修にとどまりました。先ほどからJDK1.1の時の改訂ばかり強調していますが、それがjava.util.Dateをほとんど書き換えてしまうほどの大改訂だったことが推測されるからです。

オリジナルのjava.util.Dateの実装については、残念ながらJDK1.0を入手することができないので断言できませんが、現状の内部表現がほぼCalendar(JDK1.1から追加)ベースになっていることから、相当の規模であったことが予想されます。

What happen to java.util.Date between JDK 1.0 and JDK 1.1?

どうせなら1.1と比べたいと思ったが色々要準備なので未達。
https://www.oracle.com/java/technologies/java-archive-downloads-javase11-downloads.html

だが大改訂の真相が一旦以下と比べることでできそう。
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/Date.java

    /**
     * Creates today's date/time.
     */
    public Date () {
	this(System.currentTimeMillis());
    }

    /**
     * Allocates a <code>Date</code> object and initializes it so that
     * it represents the instant at the start of the second specified
     * by the <code>year</code>, <code>month</code>, <code>date</code>,
     * <code>hrs</code>, <code>min</code>, and <code>sec</code> arguments,
     * in the local time zone.
     *
     * @param   year    the year minus 1900.
     * @param   month   the month between 0-11.
     * @param   date    the day of the month between 1-31.
     * @param   hrs     the hours between 0-23.
     * @param   min     the minutes between 0-59.
     * @param   sec     the seconds between 0-59.
     * @see     java.util.Calendar
     * @deprecated As of JDK version 1.1,
     * replaced by <code>Calendar.set(year + 1900, month, date,
     * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
     * month, date, hrs, min, sec)</code>.
     */
    @Deprecated
    public Date(int year, int month, int date, int hrs, int min, int sec) {
        int y = year + 1900;
        // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
        if (month >= 12) {
            y += month / 12;
            month %= 12;
        } else if (month < 0) {
            y += CalendarUtils.floorDivide(month, 12);
            month = CalendarUtils.mod(month, 12);
        }
        BaseCalendar cal = getCalendarSystem(y);
        cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
        cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs, min, sec, 0);
        getTimeImpl();
        cdate = null;
    }
/**
     * Creates a date. The fields are normalized before the Date object is
     * created. The arguments do not have to be in the correct range. For
     * example, the 32nd of January is correctly interpreted as the 1st of
     * February. You can use this to figure out what day a particular date
     * falls on.
     * @param year	a year after 1900
     * @param month	a month between 0-11
     * @param date	day of the month between 1-31
     * @param hrs	hours between 0-23
     * @param min	minutes between 0-59
     * @param sec	seconds between 0-59
     */
    public Date (int year, int month, int date, int hrs, int min, int sec) {
	expanded = true;
	valueValid = false;
	tm_millis = 0;
	tm_sec = (byte) sec;
	tm_min = (byte) min;
	tm_hour = (byte) hrs;
	tm_mday = (byte) date;
	tm_mon = (byte) month;
	tm_wday = 0;
	tm_yday = 0;
	tm_year = year;
	computeValue();
	expand();
    }

Discussion