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() )}