From 2a6a1d70ffd50e1322fb99868ae585a0cedb091c Mon Sep 17 00:00:00 2001 From: John Marrett Date: Thu, 29 Dec 2022 07:53:39 -0500 Subject: [PATCH] Add ParseServerTime TZ fix and tests --- src/Utils.cpp | 15 +++++++++++++++ test/UtilsTest.cpp | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/Utils.cpp b/src/Utils.cpp index 870edeca..c591ee8d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -587,7 +587,22 @@ timeval CUtils::ParseServerTime(const CString& sTime) { struct timeval tv; memset(&tv, 0, sizeof(tv)); if (cp) { + char* oldTZ = getenv("TZ"); + if (oldTZ) oldTZ = strdup(oldTZ); + setenv("TZ", "UTC", 1); + tzset(); + tv.tv_sec = mktime(&stm); + + // restore old value + if (oldTZ) { + setenv("TZ", oldTZ, 1); + free(oldTZ); + } else { + unsetenv("TZ"); + } + tzset(); + CString s_usec(cp); if (s_usec.TrimPrefix(".") && s_usec.TrimSuffix("Z")) { tv.tv_usec = s_usec.ToULong() * 1000; diff --git a/test/UtilsTest.cpp b/test/UtilsTest.cpp index b45553b1..46edd27d 100644 --- a/test/UtilsTest.cpp +++ b/test/UtilsTest.cpp @@ -109,6 +109,27 @@ TEST(UtilsTest, ServerTime) { CString str3 = CUtils::FormatServerTime(tv3); EXPECT_EQ(str3, "1970-01-01T00:00:00.000Z"); + if (oldTZ) { + setenv("TZ", oldTZ, 1); + free(oldTZ); + } else { + unsetenv("TZ"); + } + tzset(); + +} + +TEST(UtilsTest, ParseServerTime) { + char* oldTZ = getenv("TZ"); + if (oldTZ) oldTZ = strdup(oldTZ); + setenv("TZ", "America/Montreal", 1); + tzset(); + + timeval tv4 = CUtils::ParseServerTime("2011-10-19T16:40:51.620Z"); + CString str4 = CUtils::FormatServerTime(tv4); + EXPECT_EQ(str4, "2011-10-19T16:40:51.620Z"); + + if (oldTZ) { setenv("TZ", oldTZ, 1); free(oldTZ);