tangled
alpha
login
or
join now
timtinkers.online
/
lemoncalendar
0
fork
atom
this repo has no description
0
fork
atom
overview
issues
pulls
pipelines
Deploy UTC time zone fix??
timtinkers.online
1 year ago
023c5b93
057b265e
+68
-11
1 changed file
expand all
collapse all
unified
split
islands
WeekPicker.tsx
+68
-11
islands/WeekPicker.tsx
···
1
1
import { useEffect, useRef, useState } from "preact/hooks";
2
2
import { IS_BROWSER } from "$fresh/runtime.ts";
3
3
-
import startOfMonth from "https://deno.land/x/date_fns@v2.22.1/startOfMonth/index.ts";
4
4
-
import startOfWeek from "https://deno.land/x/date_fns@v2.22.1/startOfWeek/index.ts";
5
3
import addMonths from "https://deno.land/x/date_fns@v2.22.1/addMonths/index.ts";
6
4
import format from "https://deno.land/x/date_fns@v2.22.1/format/index.js";
7
5
import subMonths from "https://deno.land/x/date_fns@v2.22.1/subMonths/index.ts";
···
33
31
);
34
32
35
33
if (onWeekChange) {
36
36
-
onWeekChange(weekDates[0], weekDates[6]);
34
34
+
// Ensure we're passing UTC-normalized dates to avoid timezone issues
35
35
+
onWeekChange(
36
36
+
createUTCDate(weekDates[0]),
37
37
+
createUTCDate(weekDates[6]),
38
38
+
);
37
39
}
38
40
} else {
39
41
// Set to current week if no default provided
···
45
47
);
46
48
47
49
if (onWeekChange) {
48
48
-
onWeekChange(weekDates[0], weekDates[6]);
50
50
+
// Ensure we're passing UTC-normalized dates to avoid timezone issues
51
51
+
onWeekChange(
52
52
+
createUTCDate(weekDates[0]),
53
53
+
createUTCDate(weekDates[6]),
54
54
+
);
49
55
}
50
56
}
51
57
}, []);
52
58
59
59
+
// Create a UTC date with the same year, month, day as the input date
60
60
+
// This ensures the date is not shifted due to local timezone
61
61
+
const createUTCDate = (date: Date): Date => {
62
62
+
const utcDate = new Date(Date.UTC(
63
63
+
date.getFullYear(),
64
64
+
date.getMonth(),
65
65
+
date.getDate(),
66
66
+
0,
67
67
+
0,
68
68
+
0,
69
69
+
0,
70
70
+
));
71
71
+
return utcDate;
72
72
+
};
73
73
+
53
74
const generateWeekDates = (baseDate: Date): Date[] => {
54
75
const dates: Date[] = [];
55
55
-
// Use date-fns to get the Monday of the week in UTC
56
56
-
const weekStart = startOfWeek(baseDate, { weekStartsOn: 1 });
76
76
+
77
77
+
// Create a fresh Date object to avoid any timezone shifts
78
78
+
const baseDateClone = new Date(baseDate);
57
79
80
80
+
// Get the day of week (0 = Sunday, 1 = Monday, etc.)
81
81
+
const dayOfWeek = baseDateClone.getDay();
82
82
+
83
83
+
// Calculate how many days to subtract to get to Monday
84
84
+
const daysToSubtract = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
85
85
+
86
86
+
// Set to Monday
87
87
+
const weekStart = new Date(baseDateClone);
88
88
+
weekStart.setDate(baseDateClone.getDate() - daysToSubtract);
89
89
+
90
90
+
// Ensure the time component is zeroed out
91
91
+
weekStart.setHours(0, 0, 0, 0);
92
92
+
93
93
+
// Generate the 7 days of the week
58
94
for (let i = 0; i < 7; i++) {
59
95
const date = new Date(weekStart);
60
60
-
date.setUTCDate(weekStart.getUTCDate() + i);
96
96
+
date.setDate(weekStart.getDate() + i);
61
97
dates.push(date);
62
98
}
63
99
···
80
116
);
81
117
82
118
if (onWeekChange) {
83
83
-
onWeekChange(weekDates[0], weekDates[6]);
119
119
+
// Ensure we're passing UTC-normalized dates to avoid timezone issues
120
120
+
onWeekChange(
121
121
+
createUTCDate(weekDates[0]),
122
122
+
createUTCDate(weekDates[6]),
123
123
+
);
84
124
}
85
125
}
86
126
···
299
339
const month = date.getMonth();
300
340
301
341
// First day of the month
302
302
-
const firstDay = startOfMonth(new Date(year, month, 1));
342
342
+
const firstDay = new Date(year, month, 1);
303
343
304
344
const days: Date[] = [];
305
345
···
325
365
const startOfWeek = selectedDates[0];
326
366
const endOfWeek = selectedDates[6];
327
367
368
368
+
// Compare only the date parts, ignoring time
369
369
+
const dateOnly = new Date(
370
370
+
date.getFullYear(),
371
371
+
date.getMonth(),
372
372
+
date.getDate(),
373
373
+
);
374
374
+
const startOnly = new Date(
375
375
+
startOfWeek.getFullYear(),
376
376
+
startOfWeek.getMonth(),
377
377
+
startOfWeek.getDate(),
378
378
+
);
379
379
+
const endOnly = new Date(
380
380
+
endOfWeek.getFullYear(),
381
381
+
endOfWeek.getMonth(),
382
382
+
endOfWeek.getDate(),
383
383
+
);
384
384
+
328
385
return (
329
329
-
date.getTime() >= startOfWeek.getTime() &&
330
330
-
date.getTime() <= endOfWeek.getTime()
386
386
+
dateOnly >= startOnly &&
387
387
+
dateOnly <= endOnly
331
388
);
332
389
}
333
390
}