diff options
author | George Hazan <george.hazan@gmail.com> | 2025-04-23 13:47:43 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2025-04-23 13:47:43 +0300 |
commit | a82410a3c20ba13969f37d3ab14f6e8ca1067284 (patch) | |
tree | 1da9ce420e7867318d42d0ffa46f2eba4cb47883 /src | |
parent | 2d6c10c9d420d6e1f00cd2d7649f66728ee3e90f (diff) |
common code went to the core utils
Diffstat (limited to 'src')
-rw-r--r-- | src/mir_core/src/mir_core.def | 1 | ||||
-rw-r--r-- | src/mir_core/src/mir_core64.def | 1 | ||||
-rw-r--r-- | src/mir_core/src/utils.cpp | 51 |
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", ×tamp.tm_hour, ×tamp.tm_min, ×tamp.tm_sec) != 3)
+ return (time_t)0;
+
+ timestamp.tm_isdst = 0; // DST is already present in _timezone below
+ time_t t = mktime(×tamp);
+
+ _tzset();
+ t -= _timezone;
+ return (t >= 0) ? t : 0;
+}
|