From 5d49fd0a200c43675975dab30bf4948e82dceb94 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 19 Mar 2019 11:51:35 +0100 Subject: [PATCH] parseDateTime: fix tzOffset + daysOffset :bug: closes #106 --- parse/date-time.js | 29 ++++++++++++----------------- test/common.js | 4 ++++ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/parse/date-time.js b/parse/date-time.js index 7d945a95..cc69a30a 100644 --- a/parse/date-time.js +++ b/parse/date-time.js @@ -1,6 +1,6 @@ 'use strict' -const {DateTime, IANAZone} = require('luxon') +const {DateTime, FixedOffsetZone, IANAZone} = require('luxon') const timezones = new WeakMap() @@ -19,26 +19,21 @@ const parseDateTime = (profile, date, time, tzOffset = null, timestamp = false) const daysOffset = time.length > 6 ? parseInt(time.slice(0, -6)) : 0 let timezone - if (timezones.has(profile)) timezone = timezones.get(profile) - else { + if (tzOffset !== null) { + timezone = FixedOffsetZone.instance(tzOffset) + } else if (timezones.has(profile)) { + timezone = timezones.get(profile) + } else { timezone = new IANAZone(profile.timezone) timezones.set(profile, timezone) } - if (tzOffset !== null) { - // We don't know the timezone, but only the *timezone offset*, which is why we - // can't use Luxon to process the offset. - const isoOffset = ('0' + (tzOffset / 60 | 0)).slice(-2) + ('0' + (tzOffset % 60)).slice(-2) - const isoStr = pDate.join('-') + 'T' + pTime.join(':') + '+' + isoOffset - return timestamp ? +new Date(isoStr) : isoStr - } else { - let dt = DateTime.fromISO(pDate.join('-') + 'T' + pTime.join(':'), { - locale: profile.locale, - zone: timezone - }) - if (daysOffset > 0) dt = dt.plus({days: daysOffset}) - return timestamp ? dt.toMillis() : dt.toISO() - } + let dt = DateTime.fromISO(pDate.join('-') + 'T' + pTime.join(':'), { + locale: profile.locale, + zone: timezone + }) + if (daysOffset > 0) dt = dt.plus({days: daysOffset}) + return timestamp ? dt.toMillis() : dt.toISO() } module.exports = parseDateTime diff --git a/test/common.js b/test/common.js index cd3d8307..d8839f20 100644 --- a/test/common.js +++ b/test/common.js @@ -42,5 +42,9 @@ test('parseDateTime: works', (t) => { assert(['20190318', '02131910', null, false], '2019-03-20T13:19:10.000+01:00') assert(['20190318', '02131910', null, true], +new Date('2019-03-20T13:19:10.000+01:00')) + // manual timezone offset day offset + assert(['20190318', '02131910', 150, false], '2019-03-20T13:19:10.000+02:30') + assert(['20190318', '02131910', 150, true], +new Date('2019-03-20T13:19:10.000+02:30')) + t.end() })