summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mir_core/src/mir_core.def1
-rw-r--r--src/mir_core/src/mir_core64.def1
-rw-r--r--src/mir_core/src/utils.cpp51
3 files changed, 53 insertions, 0 deletions
diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def
index 47e6355063..4061511fb0 100644
--- a/src/mir_core/src/mir_core.def
+++ b/src/mir_core/src/mir_core.def
@@ -1587,3 +1587,4 @@ _db_event_delivered@8 @1806 NONAME
??6MBinBuffer@@QAEAAV0@G@Z @1812 NONAME
??6MBinBuffer@@QAEAAV0@I@Z @1813 NONAME
??6MBinBuffer@@QAEAAV0@_K@Z @1814 NONAME
+_Utils_IsoToUnixTime@4 @1815 NONAME
diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def
index 541b559b70..16e49f90b4 100644
--- a/src/mir_core/src/mir_core64.def
+++ b/src/mir_core/src/mir_core64.def
@@ -1587,3 +1587,4 @@ db_event_delivered @1806 NONAME
??6MBinBuffer@@QEAAAEAV0@G@Z @1812 NONAME
??6MBinBuffer@@QEAAAEAV0@I@Z @1813 NONAME
??6MBinBuffer@@QEAAAEAV0@_K@Z @1814 NONAME
+Utils_IsoToUnixTime @1815 NONAME
diff --git a/src/mir_core/src/utils.cpp b/src/mir_core/src/utils.cpp
index 630418cdab..d6f953fde0 100644
--- a/src/mir_core/src/utils.cpp
+++ b/src/mir_core/src/utils.cpp
@@ -584,3 +584,54 @@ MIR_CORE_DLL(bool) Utils_IsRtl(const wchar_t *pszwText)
return false;
}
+
+MIR_CORE_DLL(time_t) Utils_IsoToUnixTime(const char *stamp)
+{
+ wchar_t date[9];
+ int i, y;
+
+ if (stamp == nullptr)
+ return 0;
+
+ auto *p = stamp;
+
+ // Get the date part
+ for (i = 0; *p != '\0' && i < 8 && isdigit(*p); p++, i++)
+ date[i] = *p;
+
+ // Parse year
+ if (i == 6) {
+ // 2-digit year (1970-2069)
+ y = (date[0] - '0') * 10 + (date[1] - '0');
+ if (y < 70) y += 100;
+ }
+ else if (i == 8) {
+ // 4-digit year
+ y = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + date[3] - '0';
+ y -= 1900;
+ }
+ else return 0;
+
+ struct tm timestamp;
+ timestamp.tm_year = y;
+
+ // Parse month
+ timestamp.tm_mon = (date[i - 4] - '0') * 10 + date[i - 3] - '0' - 1;
+
+ // Parse date
+ timestamp.tm_mday = (date[i - 2] - '0') * 10 + date[i - 1] - '0';
+
+ // Skip any date/time delimiter
+ for (; *p != '\0' && !isdigit(*p); p++);
+
+ // Parse time
+ if (sscanf(p, "%d:%d:%d", &timestamp.tm_hour, &timestamp.tm_min, &timestamp.tm_sec) != 3)
+ return (time_t)0;
+
+ timestamp.tm_isdst = 0; // DST is already present in _timezone below
+ time_t t = mktime(&timestamp);
+
+ _tzset();
+ t -= _timezone;
+ return (t >= 0) ? t : 0;
+}