8072602: Unpredictable timezone on Windows when OS's timezone is not found in tzmappings
Reviewed-by: peytoia
--- 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);
}