< prev index next >

src/hotspot/share/runtime/os.cpp

Print this page

        

@@ -87,19 +87,36 @@
 static size_t cur_malloc_words = 0;  // current size for MallocMaxTestWords
 
 DEBUG_ONLY(bool os::_mutex_init_done = false;)
 
 static time_t get_timezone(const struct tm* time_struct) {
+  // seconds to add to local time to get UTC
+  time_t offset;
+
 #if defined(_ALLBSD_SOURCE)
-  return time_struct->tm_gmtoff;
+  offset = -(time_struct->tm_gmtoff);
 #elif defined(_WINDOWS)
   long zone;
   _get_timezone(&zone);
-  return static_cast<time_t>(zone);
+  offset = static_cast<time_t>(zone);
 #else
-  return timezone;
+  offset = timezone;
+#endif
+
+// tm_gmtoff already includes adjustment for daylight saving
+#if !defined(_ALLBSD_SOURCE)
+  // If daylight savings time is in effect,
+  // we are 1 hour East of our time zone
+  const time_t seconds_per_minute = 60;
+  const time_t minutes_per_hour = 60;
+  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
+  if (time_struct->tm_isdst > 0) {
+    offset = offset - seconds_per_hour;
+  }
 #endif
+
+  return offset;
 }
 
 int os::snprintf(char* buf, size_t len, const char* fmt, ...) {
   va_list args;
   va_start(args, fmt);

@@ -150,21 +167,11 @@
     if (localtime_pd(&seconds_since_19700101, &time_struct) == NULL) {
       assert(false, "Failed localtime_pd");
       return NULL;
     }
   }
-  const time_t zone = get_timezone(&time_struct);
-
-  // If daylight savings time is in effect,
-  // we are 1 hour East of our time zone
-  const time_t seconds_per_minute = 60;
-  const time_t minutes_per_hour = 60;
-  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
-  time_t UTC_to_local = zone;
-  if (time_struct.tm_isdst > 0) {
-    UTC_to_local = UTC_to_local - seconds_per_hour;
-  }
+  time_t UTC_to_local = get_timezone(&time_struct);
 
   // No offset when dealing with UTC
   if (utc) {
     UTC_to_local = 0;
   }

@@ -181,10 +188,13 @@
   if (local_to_UTC < 0) {
     sign_local_to_UTC = '-';
     abs_local_to_UTC = -(abs_local_to_UTC);
   }
   // Convert time zone offset seconds to hours and minutes.
+  const time_t seconds_per_minute = 60;
+  const time_t minutes_per_hour = 60;
+  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
   const time_t zone_hours = (abs_local_to_UTC / seconds_per_hour);
   const time_t zone_min =
     ((abs_local_to_UTC % seconds_per_hour) / seconds_per_minute);
 
   // Print an ISO 8601 date and time stamp into the buffer
< prev index next >