diff --git a/resources/js/components/fieldtypes/DateFieldtype.vue b/resources/js/components/fieldtypes/DateFieldtype.vue index 0f0f1742f9f..b5d532891ff 100644 --- a/resources/js/components/fieldtypes/DateFieldtype.vue +++ b/resources/js/components/fieldtypes/DateFieldtype.vue @@ -188,13 +188,21 @@ export default { let start = value.start; let end = value.end; + if (!start.offset && !start.timeZone) { + start = toZoned(start, this.displayTimezone); + } + + if (!end.offset && !end.timeZone) { + end = toZoned(end, this.displayTimezone); + } + if (!this.hasTime) { end.set({ hour: 23, minute: 59, second: 59 }); } return this.update({ - start: toZoned(start, 'UTC').toAbsoluteString(), - end: toZoned(end, 'UTC').toAbsoluteString(), + start: toTimeZone(start, 'UTC').toAbsoluteString(), + end: toTimeZone(end, 'UTC').toAbsoluteString(), }); } diff --git a/resources/js/tests/components/fieldtypes/DateFieldtype.test.js b/resources/js/tests/components/fieldtypes/DateFieldtype.test.js index 3492dd32357..b21e75972f0 100644 --- a/resources/js/tests/components/fieldtypes/DateFieldtype.test.js +++ b/resources/js/tests/components/fieldtypes/DateFieldtype.test.js @@ -123,6 +123,33 @@ test('range dates use configured timezone', () => { expect(value.end.toString()).toBe('2025-12-26T02:23:00+00:00[Europe/London]'); }); +test('range dates with time are saved in the configured timezone', async () => { + process.env.TZ = 'America/New_York'; + + const { CalendarDateTime } = await import('@internationalized/date'); + + const dateField = makeDateField({ + meta: { timezone: 'America/New_York' }, + config: { + mode: 'range', + time_enabled: true, + earliest_date: { date: null, time: null }, + latest_date: { date: null, time: null }, + }, + }); + + dateField.vm.datePickerUpdated({ + start: new CalendarDateTime(2012, 8, 29, 5, 0, 0), + end: new CalendarDateTime(2013, 9, 27, 23, 59, 0), + }); + + // 05:00 in New York (EDT, -04:00) is 09:00 UTC; 23:59 becomes 03:59 the next day. + expect(dateField.emitted('update:value')[0][0]).toEqual({ + start: '2012-08-29T09:00:00.000Z', + end: '2013-09-28T03:59:00.000Z', + }); +}); + test.each([ ['UTC'], ['America/New_York'],