From ad17d499bf1211a8cb808a8710f11237c78d5761 Mon Sep 17 00:00:00 2001 From: "kosak@google.com" Date: Thu, 8 Jan 2015 03:12:18 +0000 Subject: Small Mingw localtime() fix. Thanks tberghammer for pointing it out. https://codereview.appspot.com/185420043/ git-svn-id: http://googletest.googlecode.com/svn/trunk@702 861a406c-534a-0410-8894-cb66d6ee9925 --- src/gtest.cc | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/gtest.cc b/src/gtest.cc index 64ab767..7fd5f29 100644 --- a/src/gtest.cc +++ b/src/gtest.cc @@ -3505,19 +3505,28 @@ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { return ss.str(); } +static bool PortableLocaltime(time_t seconds, struct tm* out) { +#if defined(_MSC_VER) + return localtime_s(out, &seconds) == 0; +#elif defined(__MINGW32__) || defined(__MINGW64__) + // MINGW provides neither localtime_r nor localtime_s, but uses + // Windows' localtime(), which has a thread-local tm buffer. + struct tm* tm_ptr = localtime(&seconds); // NOLINT + if (tm_ptr == NULL) + return false; + *out = *tm_ptr; + return true; +#else + return localtime_r(&seconds, out) != NULL; +#endif +} + // Converts the given epoch time in milliseconds to a date string in the ISO // 8601 format, without the timezone information. std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { - time_t seconds = static_cast(ms / 1000); struct tm time_struct; -#ifdef _MSC_VER - if (localtime_s(&time_struct, &seconds) != 0) - return ""; // Invalid ms value -#else - if (localtime_r(&seconds, &time_struct) == NULL) - return ""; // Invalid ms value -#endif - + if (!PortableLocaltime(static_cast(ms / 1000), &time_struct)) + return ""; // YYYY-MM-DDThh:mm:ss return StreamableToString(time_struct.tm_year + 1900) + "-" + String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + -- cgit v1.2.1