aboutsummaryrefslogtreecommitdiff
path: root/stdlib/datetime.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-29 23:09:37 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-29 23:09:37 -0400
commitd7145198095d9f316ecffc97499ae2791384da20 (patch)
tree71d5ff4742de1230a58f40cc70b74270f2c0aaa2 /stdlib/datetime.c
parentd0c015c74a7b1fe479f3c753edd9d35e6c922e62 (diff)
Fix some timezone issues
Diffstat (limited to 'stdlib/datetime.c')
-rw-r--r--stdlib/datetime.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/stdlib/datetime.c b/stdlib/datetime.c
index a3bb42c1..bc1d88e7 100644
--- a/stdlib/datetime.c
+++ b/stdlib/datetime.c
@@ -21,7 +21,7 @@ public Text_t DateTime$as_text(const DateTime_t *dt, bool colorize, const TypeIn
struct tm info;
struct tm *final_info = localtime_r(&dt->tv_sec, &info);
static char buf[256];
- size_t len = strftime(buf, sizeof(buf), "%c", final_info);
+ size_t len = strftime(buf, sizeof(buf), "%c %Z", final_info);
Text_t text = Text$format("%.*s", (int)len, buf);
if (colorize)
text = Text$concat(Text("\x1b[36m"), text, Text("\x1b[m"));
@@ -141,12 +141,18 @@ public Text_t DateTime$time(DateTime_t dt, bool seconds, bool am_pm, bool local_
public OptionalDateTime_t DateTime$parse(Text_t text, Text_t format)
{
struct tm info = {.tm_isdst=-1};
- char *invalid = strptime(Text$as_c_string(text), Text$as_c_string(format), &info);
+ const char *str = Text$as_c_string(text);
+ const char *fmt = Text$as_c_string(format);
+ if (strstr(fmt, "%Z"))
+ fail("The %%Z specifier is not supported for time parsing!");
+
+ char *invalid = strptime(str, fmt, &info);
if (!invalid || invalid[0] != '\0')
return NULL_DATETIME;
+ long offset = info.tm_gmtoff; // Need to cache this because mktime() mutates it to local timezone >:(
time_t t = mktime(&info);
- return (DateTime_t){.tv_sec=t};
+ return (DateTime_t){.tv_sec=t + offset - info.tm_gmtoff};
}
static inline Text_t num_format(long n, const char *unit)
@@ -195,7 +201,7 @@ public Text_t DateTime$relative(DateTime_t dt, DateTime_t relative_to, bool loca
CONSTFUNC public Int64_t DateTime$unix_timestamp(DateTime_t dt)
{
- return (Int64_t)(dt.tv_sec);
+ return (Int64_t)dt.tv_sec;
}
CONSTFUNC public DateTime_t DateTime$from_unix_timestamp(Int64_t timestamp)