From e454daf7279d48cbf31de3222d442ce1dbb1781d Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sat, 18 Mar 2023 07:32:39 -0500 Subject: [PATCH] Fix timezone issues with strftime (#5762) * Fix timezone issues with strftime * Fix timezone adjustment * Fix bug --- web/src/utils/dateUtil.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/web/src/utils/dateUtil.ts b/web/src/utils/dateUtil.ts index b5c483496..8f1456b5f 100644 --- a/web/src/utils/dateUtil.ts +++ b/web/src/utils/dateUtil.ts @@ -56,7 +56,7 @@ export const formatUnixTimestampToDateTime = (unixTimestamp: number, config: Dat // use strftime_fmt if defined in config file if (strftime_fmt) { - const strftime_locale = strftime.localizeByIdentifier(locale); + const strftime_locale = strftime.timezone(getUTCOffset(date, timezone)).localizeByIdentifier(locale); return strftime_locale(strftime_fmt, date); } @@ -114,3 +114,18 @@ export const getDurationFromTimestamps = (start_time: number, end_time: number | } return duration; }; + +/** + * Adapted from https://stackoverflow.com/a/29268535 this takes a timezone string and + * returns the offset of that timezone from UTC in minutes. + * @param timezone string representation of the timezone the user is requesting + * @returns number of minutes offset from UTC + */ +const getUTCOffset = (date: Date, timezone: string): number => { + const utcDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60 * 1000)); + // locale of en-CA is required for proper locale format + let iso = utcDate.toLocaleString('en-CA', { timeZone: timezone, hour12: false }).replace(', ', 'T'); + iso += '.' + utcDate.getMilliseconds().toString().padStart(3, '0'); + const target = new Date(iso + 'Z'); + return (target.getTime() - utcDate.getTime()) / 60 / 1000; +}