From bf3e945d7579d08d4839ad059b1071baab54ede5 Mon Sep 17 00:00:00 2001 From: ItzNotABug Date: Wed, 11 Sep 2024 14:49:01 +0530 Subject: [PATCH] fix: cron per local time for utc. --- .../database-[database]/backups/createPolicy.svelte | 12 +++++++++--- .../database-[database]/backups/policy.svelte | 13 ++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte index 0ff910075..e54e67faa 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte @@ -5,7 +5,6 @@ FormList, InputRadio, InputSelect, - InputSelectCheckbox, InputText, InputTime, Label @@ -59,7 +58,14 @@ let backupFrequency: string = 'end'; const generateCronExpression = () => { - const [hour, minute] = selectedTime.split(':'); + const [localHour, localMinute] = selectedTime.split(':'); + + // Convert local time to UTC + const now = new Date(); + now.setHours(parseInt(localHour), parseInt(localMinute), 0); + + const utcHour = now.getUTCHours(); + const utcMinute = now.getUTCMinutes(); let dayOfWeek = '*'; let dayOfMonth = '*'; @@ -77,7 +83,7 @@ return `${new Date().getMinutes()} * * * *`; } - return `${minute} ${hour} ${dayOfMonth} * ${dayOfWeek}`; + return `${utcMinute} ${utcHour} ${dayOfMonth} * ${dayOfWeek}`; }; // TODO: reset values on modal close. diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/policy.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/backups/policy.svelte index 9e3bd9d5a..e825d77c2 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/policy.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/backups/policy.svelte @@ -55,7 +55,7 @@ return `Retained for ${retention} day${retention > 1 ? 's' : ''}`; }; - function getPolicyDescription(cron: string): string { + const getPolicyDescription = (cron: string): string => { const cronParts = cron.split(' '); // A standard cron has 5 parts: minute, hour, day of month, month, day of week @@ -88,7 +88,14 @@ ) { return 'Runs daily'; } - } + }; + + // Switches to UTC for non-hourly, + // keeps local time for hourly schedules. + const isHourlySchedule = (cron: string): boolean => { + const [_, hour, dayOfMonth, month, dayOfWeek] = cron.split(' '); + return hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*'; + }; {toLocaleDateTime( - parseExpression(policy.schedule, { utc: false }).next().toString() + parseExpression(policy.schedule, { utc: !isHourlySchedule(policy.schedule) }).next().toString() )}