Add CUtils::ParseServerTime()

This commit is contained in:
J-P Nurmi
2015-07-12 00:16:57 +02:00
parent 645fa855e0
commit 51caa5c4cf
3 changed files with 43 additions and 0 deletions
+1
View File
@@ -83,6 +83,7 @@ public:
static CString CTime(time_t t, const CString& sTZ);
static CString FormatTime(time_t t, const CString& sFormat, const CString& sTZ);
static CString FormatServerTime(const timeval& tv);
static timeval ParseServerTime(const CString& sTime);
static SCString GetTimezones();
static SCString GetEncodings();
+13
View File
@@ -458,6 +458,19 @@ CString CUtils::FormatServerTime(const timeval& tv) {
return CString(sTime) + "." + s_msec + "Z";
}
timeval CUtils::ParseServerTime(const CString& sTime) {
struct tm stm;
memset(&stm, 0, sizeof(stm));
const char* cp = strptime(sTime.c_str(), "%Y-%m-%dT%H:%M:%S", &stm);
struct timeval tv;
tv.tv_sec = mktime(&stm);
CString s_usec(cp);
if (s_usec.TrimPrefix(".") && s_usec.TrimSuffix("Z")) {
tv.tv_usec = s_usec.ToULong() * 1000;
}
return tv;
}
namespace {
void FillTimezones(const CString& sPath, SCString& result, const CString& sPrefix) {
CDir Dir;
+29
View File
@@ -75,3 +75,32 @@ TEST(IRC32, SetMessageTags) {
EXPECT_EQ(R"(@a=\:\s\\\r\n :rest)", sLine);
}
TEST(UtilsTest, ServerTime) {
char* oldTZ = getenv("TZ");
if (oldTZ) oldTZ = strdup(oldTZ);
setenv("TZ", "UTC", 1);
tzset();
timeval tv1 = CUtils::ParseServerTime("2011-10-19T16:40:51.620Z");
CString str1 = CUtils::FormatServerTime(tv1);
EXPECT_EQ("2011-10-19T16:40:51.620Z", str1);
timeval now;
if (!gettimeofday(&now, nullptr)) {
now.tv_sec = time(nullptr);
now.tv_usec = 0;
}
CString str2 = CUtils::FormatServerTime(now);
timeval tv2 = CUtils::ParseServerTime(str2);
EXPECT_EQ(now.tv_sec, tv2.tv_sec);
EXPECT_EQ(now.tv_usec, tv2.tv_usec);
if (oldTZ) {
setenv("TZ", oldTZ, 1);
free(oldTZ);
} else {
unsetenv("TZ");
}
tzset();
}