Skip to content

Commit 046dd50

Browse files
author
Nathan Reyes
committed
Fix daylight savings boundaries
1 parent f26fe84 commit 046dd50

File tree

3 files changed

+38
-27
lines changed

3 files changed

+38
-27
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"dependencies": {
2727
"core-js": "^3.6.5",
2828
"date-fns": "^2.8.1",
29+
"date-fns-tz": "^1.0.12",
2930
"lodash": "^4.17.15"
3031
},
3132
"devDependencies": {

src/utils/locale.js

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable no-bitwise, no-multi-assign */
2+
import toDate from 'date-fns-tz/toDate';
23
import defaultLocales from './defaults/locales';
34
import { pad, addPages, pageForDate, arrayHasItems } from './helpers';
45
import {
@@ -492,47 +493,51 @@ export default class Locale {
492493
return parts;
493494
}
494495

495-
getDateFromParts(parts, timezone) {
496+
getDateFromParts(parts, timeZone) {
496497
if (!parts) return null;
497498
const {
498499
year: y,
499500
month: m,
500501
day: d,
501-
hours: hrs,
502-
minutes: min,
503-
seconds: sec,
504-
milliseconds: ms,
502+
hours: hrs = 0,
503+
minutes: min = 0,
504+
seconds: sec = 0,
505+
milliseconds: ms = 0,
505506
} = parts;
506507
if (y === undefined || m === undefined || d === undefined) return null;
507-
const utcDate = new Date(
508-
Date.UTC(y || 0, m - 1, d || 0, hrs || 0, min || 0, sec || 0, ms || 0),
509-
);
510-
const tzOffsetMs = this.getTimezoneOffset(parts, timezone);
511-
return new Date(utcDate.getTime() + tzOffsetMs);
508+
509+
if (timeZone) {
510+
const dateString = `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}T${pad(
511+
hrs,
512+
2,
513+
)}:${pad(min, 2)}:${pad(sec, 2)}.${pad(ms, 3)}`;
514+
return toDate(dateString, { timeZone });
515+
}
516+
return new Date(y, m - 1, d, hrs, min, sec, ms);
512517
}
513518

514-
getTimezoneOffset(parts, timezone) {
519+
getTimezoneOffset(parts, timeZone) {
515520
const {
516521
year: y,
517522
month: m,
518523
day: d,
519-
minutes: min,
520-
seconds: sec,
521-
milliseconds: ms,
524+
hours: hrs = 0,
525+
minutes: min = 0,
526+
seconds: sec = 0,
527+
milliseconds: ms = 0,
522528
} = parts;
523-
const formatter = new Intl.DateTimeFormat('en-US', {
524-
hour: 'numeric',
525-
hour12: false,
526-
hourCycle: 'h24',
527-
timeZone: timezone || undefined,
528-
});
529-
const utcNoon = new Date(
530-
Date.UTC(y || 0, m - 1, d || 0, 12, min || 0, sec || 0, ms || 0),
531-
);
532-
const tzHours = +formatter.format(utcNoon);
533-
const tzOffset = 12 - tzHours;
534-
const msInHour = 3600000;
535-
return tzOffset * msInHour;
529+
let date;
530+
const utcDate = new Date(Date.UTC(y, m - 1, d, hrs, min, sec, ms));
531+
if (timeZone) {
532+
const dateString = `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}T${pad(
533+
hrs,
534+
2,
535+
)}:${pad(min, 2)}:${pad(sec, 2)}.${pad(ms, 3)}`;
536+
date = toDate(dateString, { timeZone });
537+
} else {
538+
date = new Date(y, m - 1, d, hrs, min, sec, ms);
539+
}
540+
return utcDate - date;
536541
}
537542

538543
toPage(arg, fromPage) {

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3932,6 +3932,11 @@ data-urls@^1.0.0, data-urls@^1.1.0:
39323932
whatwg-mimetype "^2.2.0"
39333933
whatwg-url "^7.0.0"
39343934

3935+
date-fns-tz@^1.0.12:
3936+
version "1.0.12"
3937+
resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.0.12.tgz#2d680e1099767775cff7a30eac34362d52639fed"
3938+
integrity sha512-Ca+9pjGkU90XDHnclfSjz9o7g/ZqyYyYI0aCYmbf65P75oy8gktuaRslO3UPXl3ADgAnF9/KCykQkpU3/xvtWQ==
3939+
39353940
date-fns@^2.8.1:
39363941
version "2.16.1"
39373942
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b"

0 commit comments

Comments
 (0)