Skip to content

Commit

Permalink
fix date time calculation caused by day light saving (different timez…
Browse files Browse the repository at this point in the history
…one offset during the year) (#419)
  • Loading branch information
idaho authored Oct 7, 2024
1 parent 7e0b251 commit 425bce4
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/utils/getCalendarData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const getCalendarData = async (
debuggerInstance.log(`timezone`, timezoneOffset);
debuggerInstance.log(`calendar data`, rawCalendarEvents);

const normalisedEvents = normaliseEvents(rawCalendarEvents, timezoneOffset);
const normalisedEvents = normaliseEvents(rawCalendarEvents);

normalisedEvents.sort((evtA, evtB) => evtA.date.start.getTime() - evtB.date.start.getTime());

Expand Down
8 changes: 3 additions & 5 deletions src/utils/normaliseEvents.test.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
/* eslint-disable @typescript-eslint/naming-convention */
import calendarEvents from '../../mocks/calendarData.json';
import { getTimeZoneOffset } from './getTimeZoneOffset';
import { normaliseEvents } from './normaliseEvents';

import type { RawCalendarEvent } from './calendarEvents';

describe('normaliseEvents', (): void => {
test('normaliseEvents', async () => {
const timezoneOffset = getTimeZoneOffset();
const result = normaliseEvents(calendarEvents as RawCalendarEvent[], timezoneOffset);
const result = normaliseEvents(calendarEvents as RawCalendarEvent[]);

const expectedResult = [
{
date: {
start: new Date(`2023-12-10T00:00:00${timezoneOffset}`),
end: new Date(`2023-12-11T00:00:00${timezoneOffset}`)
start: new Date(`2023-12-10T00:00:00`),
end: new Date(`2023-12-11T00:00:00`)
},
isWholeDayEvent: true,
content: {
Expand Down
33 changes: 20 additions & 13 deletions src/utils/normaliseEvents.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { getTimeZoneOffset } from './getTimeZoneOffset';

import type { CalendarEvent, RawCalendarEvent } from './calendarEvents';

const normaliseEvents = (events: RawCalendarEvent[], timezoneOffset: string): CalendarEvent[] => {
const normaliseEvents = (events: RawCalendarEvent[]): CalendarEvent[] => {
const beginingTime = new Date();

beginingTime.setUTCHours(0);
Expand All @@ -9,20 +11,25 @@ const normaliseEvents = (events: RawCalendarEvent[], timezoneOffset: string): Ca
beginingTime.setMilliseconds(0);

const isoDateString = beginingTime.toISOString();
const timeAtZero = `${isoDateString.slice(isoDateString.indexOf(`T`), -1)}${timezoneOffset}`;

return events.
map((item): CalendarEvent => ({
date: {
start: new Date('date' in item.start ? `${item.start.date}${timeAtZero}` : item.start.dateTime),
end: new Date('date' in item.end ? `${item.end.date}${timeAtZero}` : item.end.dateTime)
},
isWholeDayEvent: Boolean('date' in item.start),
content: {
...Object.fromEntries(Object.entries(item).filter(([ key ]) =>
![ 'end', 'start' ].includes(key))) as CalendarEvent['content']
}
}));
map((item): CalendarEvent => {
const start = 'date' in item.start ? item.start.date : item.start.dateTime;
const tzo = getTimeZoneOffset(new Date(start));
const timeAtZero = `${isoDateString.slice(isoDateString.indexOf(`T`), -1)}${tzo}`;

return {
date: {
start: new Date('date' in item.start ? `${item.start.date}${timeAtZero}` : item.start.dateTime),
end: new Date('date' in item.end ? `${item.end.date}${timeAtZero}` : item.end.dateTime)
},
isWholeDayEvent: Boolean('date' in item.start),
content: {
...Object.fromEntries(Object.entries(item).filter(([ key ]) =>
![ 'end', 'start' ].includes(key))) as CalendarEvent['content']
}
};
});
};

export {
Expand Down

0 comments on commit 425bce4

Please sign in to comment.