大昔に修正されたタイムゾーン関連のバグ
ある人(誰)から、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でほんとにいろんなことが変わったんだなと実感できる事例のひとつ。