# HG changeset patch # User okutsu # Date 1425264488 -32400 # Node ID 2ef8d6233715e7f2eb607868bf7974c84e704b53 # Parent b675016fabfd2535924084a79541c8e11a6e250d 8072602: Unpredictable timezone on Windows when OS's timezone is not found in tzmappings Reviewed-by: peytoia diff -r b675016fabfd -r 2ef8d6233715 jdk/src/java.base/windows/native/libjava/TimeZone_md.c --- a/jdk/src/java.base/windows/native/libjava/TimeZone_md.c Sat Feb 28 13:17:13 2015 +0100 +++ b/jdk/src/java.base/windows/native/libjava/TimeZone_md.c Mon Mar 02 11:48:08 2015 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -195,7 +195,7 @@ * Vista uses the different key name. */ if (ret != ERROR_SUCCESS) { - bufSize = sizeof(val); + bufSize = sizeof(val); ret = RegQueryValueExA(hKey, "DynamicDaylightTimeDisabled", NULL, &valueType, (LPBYTE) &val, &bufSize); } @@ -510,18 +510,49 @@ } else { std_timezone = matchJavaTZ(java_home_dir, result, winZoneName, winMapID); + if (std_timezone == NULL) { + std_timezone = getGMTOffsetID(); + } } } - return std_timezone; } /** - * Returns a GMT-offset-based time zone ID. On Win32, it always return - * NULL since the fall back is performed in getWinTimeZone(). + * Returns a GMT-offset-based time zone ID. */ char * getGMTOffsetID() { - return NULL; + LONG bias = 0; + LONG ret; + HANDLE hKey = NULL; + char zonename[32]; + + // Obtain the current GMT offset value of ActiveTimeBias. + ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_CURRENT_TZ_KEY, 0, + KEY_READ, (PHKEY)&hKey); + if (ret == ERROR_SUCCESS) { + DWORD val; + DWORD bufSize = sizeof(val); + ULONG valueType = 0; + ret = RegQueryValueExA(hKey, "ActiveTimeBias", + NULL, &valueType, (LPBYTE) &val, &bufSize); + if (ret == ERROR_SUCCESS) { + bias = (LONG) val; + } + (void) RegCloseKey(hKey); + } + + // If we can't get the ActiveTimeBias value, use Bias of TimeZoneInformation. + // Note: Bias doesn't reflect current daylight saving. + if (ret != ERROR_SUCCESS) { + TIME_ZONE_INFORMATION tzi; + if (GetTimeZoneInformation(&tzi) != TIME_ZONE_ID_INVALID) { + bias = tzi.Bias; + } + } + + customZoneName(bias, zonename); + return _strdup(zonename); }