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

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

大昔に修正されたタイムゾーン関連のバグ

ある人(誰)から、Windows Server 2008タイムゾーン関連のバグがあるという話を聞いた。発生するのが「J2SDK 1.4.2_14 b01以前」ということでえらい昔の話なのだが、ニッチな問題が好きな自分としては実際に動かして確認しないわけにはいかない(謎)ということで、試してみた。
発生するバージョンから、「J2SDK 1.4.2_14リリースでは修正済み」、「J2SDK 1.4.2_13リリースでは未修正」ということで、一応リリースノートを確認し、これら2つのバージョンで次のプログラムを実行してみた。
環境は、Windows Server 2008で起こる問題はWindows Vistaでも起こるだろう、ということでいつもの(謎)Windows Vista Businessを使用。

import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        System.out.println("java.version:       " + System.getProperty("java.version"));
        System.out.println("java.vm.version:    " + System.getProperty("java.vm.version"));
        System.out.println("os.name:            " + System.getProperty("os.name"));
        System.out.println("os.version:         " + System.getProperty("os.version"));
        System.out.println("java.util.Locale:   " + Locale.getDefault());
        System.out.println("java.util.TimeZone: " + TimeZone.getDefault());
        System.out.println("java.util.Date:     " + new Date());
        System.out.println("========");
        TimeZone.setDefault(TimeZone.getTimeZone("JST"));
        System.out.println("java.util.TimeZone: " + TimeZone.getDefault());
        System.out.println("java.util.Date:     " + new Date());
    }
}

実行結果は次の通り。
【J2SDK 1.4.2_13】

java.version:       1.4.2_13
java.vm.version:    1.4.2_13-b06
os.name:            Windows NT (unknown)
os.version:         6.0
java.util.Locale:   ja_JP
java.util.TimeZone: sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
java.util.Date:     Sat Jul 31 14:03:58 GMT 2010
========
java.util.TimeZone: sun.util.calendar.ZoneInfo[id="JST",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
java.util.Date:     Sat Jul 31 23:03:58 JST 2010

【J2SDK 1.4.2_14】

java.version:       1.4.2_14
java.vm.version:    1.4.2_14-b05
os.name:            Windows Vista
os.version:         6.0
java.util.Locale:   ja_JP
java.util.TimeZone: sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
java.util.Date:     Sat Jul 31 23:03:59 JST 2010
========
java.util.TimeZone: sun.util.calendar.ZoneInfo[id="JST",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
java.util.Date:     Sat Jul 31 23:03:59 JST 2010

確かに、1.4.2_13では、時刻自体は合っているが、タイムゾーンGMTとなっている。
さらによく見てみると、システムプロパティ"os.name"の値が"Windows NT (unknown)"となっている。
リリースノートを見てみると、次のバグが1.4.2_14で修正されたとある。

BugId Category Subcategory Description
6220825 java classes_lang System property os.name should be "Windows Vista" on Windows Vista
6393531 java classes_util_i18n (tz) [Vista] Platform time zone detection support

Windows Vistaでほんとにいろんなことが変わったんだなと実感できる事例のひとつ。