From 4a6fbc2a92dcecd07af04581f3ae625b632261dd Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Fri, 17 Jan 2025 19:39:08 +0100 Subject: [PATCH] refactor: add timezone data to session --- .../src/api-data/session/session.service.ts | 3 ++- apps/server/src/utils/time.ts | 18 ++++++++++++++++-- .../ontime-controller/BackendResponse.type.ts | 2 +- packages/utils/index.ts | 3 ++- .../utils/src/date-utils/timeFormatting.ts | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/apps/server/src/api-data/session/session.service.ts b/apps/server/src/api-data/session/session.service.ts index 7fbee53c3..eae4826c0 100644 --- a/apps/server/src/api-data/session/session.service.ts +++ b/apps/server/src/api-data/session/session.service.ts @@ -7,6 +7,7 @@ import { getLastRequest } from '../../api-integration/integration.controller.js' import { getLastLoadedProject } from '../../services/app-state-service/AppStateService.js'; import { runtimeService } from '../../services/runtime-service/RuntimeService.js'; import { getNetworkInterfaces } from '../../utils/network.js'; +import { getTimezoneLabel } from '../../utils/time.js'; const startedAt = new Date(); @@ -24,7 +25,7 @@ export async function getSessionStats(): Promise { lastRequest: lastRequest !== null ? lastRequest.toISOString() : null, projectName, playback, - timezone: startedAt.getTimezoneOffset(), + timezone: getTimezoneLabel(startedAt), }; } diff --git a/apps/server/src/utils/time.ts b/apps/server/src/utils/time.ts index 44ca5619f..cb9e72e0a 100644 --- a/apps/server/src/utils/time.ts +++ b/apps/server/src/utils/time.ts @@ -1,5 +1,4 @@ -import { MILLIS_PER_HOUR, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, parseUserTime } from 'ontime-utils'; -import { isISO8601 } from '../../../../packages/utils/src/date-utils/isTimeString.js'; +import { MILLIS_PER_HOUR, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, pad, parseUserTime, isISO8601 } from 'ontime-utils'; export const timeFormat = 'HH:mm'; export const timeFormatSeconds = 'HH:mm:ss'; @@ -46,3 +45,18 @@ export function parseExcelDate(excelDate: unknown): number { return 0; } + +export function getTimezoneLabel(date: Date): string { + const tz = date.getTimezoneOffset(); + const tzName = Intl.DateTimeFormat().resolvedOptions().timeZone; + + // timezone offset is inverted + const sign = tz < 0 ? '+' : '-'; + const abs = Math.abs(tz); + + // convert minutes to hours + const hours = Math.floor(abs / 60); + const minutes = abs % 60; + + return `GMT ${sign}${pad(hours)}:${pad(minutes)} ${tzName}`; +} diff --git a/packages/types/src/api/ontime-controller/BackendResponse.type.ts b/packages/types/src/api/ontime-controller/BackendResponse.type.ts index d81dd8827..79fa60986 100644 --- a/packages/types/src/api/ontime-controller/BackendResponse.type.ts +++ b/packages/types/src/api/ontime-controller/BackendResponse.type.ts @@ -15,7 +15,7 @@ export interface SessionStats { lastRequest: MaybeString; projectName: string; playback: Playback; - timezone: number; + timezone: string; } export interface GetInfo { diff --git a/packages/utils/index.ts b/packages/utils/index.ts index 6a7e29e94..23681c87f 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -44,10 +44,11 @@ export { millisToSeconds, secondsInMillis, } from './src/date-utils/conversionUtils.js'; -export { isTimeString } from './src/date-utils/isTimeString.js'; +export { isISO8601, isTimeString } from './src/date-utils/isTimeString.js'; export { formatFromMillis, millisToString, + pad, removeLeadingZero, removeSeconds, removeTrailingZero, diff --git a/packages/utils/src/date-utils/timeFormatting.ts b/packages/utils/src/date-utils/timeFormatting.ts index 8a0c9f4cd..01b3b3254 100644 --- a/packages/utils/src/date-utils/timeFormatting.ts +++ b/packages/utils/src/date-utils/timeFormatting.ts @@ -2,7 +2,7 @@ import type { MaybeNumber } from 'ontime-types'; import { millisToSeconds, secondsToHours, secondsToMinutes } from './conversionUtils.js'; -function pad(val: number): string { +export function pad(val: number): string { return String(val).padStart(2, '0'); }