mirror of
https://github.com/znc/znc.git
synced 2026-08-08 18:03:22 +02:00
Add CUtils::ParseServerTime()
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user