parseDateTime: fix tzOffset + daysOffset 🐛

closes #106
This commit is contained in:
Jannis R 2019-03-19 11:51:35 +01:00 committed by Jannis Redmann
parent 8bfc4aee0f
commit 5d49fd0a20
2 changed files with 16 additions and 17 deletions

View file

@ -1,6 +1,6 @@
'use strict' 'use strict'
const {DateTime, IANAZone} = require('luxon') const {DateTime, FixedOffsetZone, IANAZone} = require('luxon')
const timezones = new WeakMap() 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 const daysOffset = time.length > 6 ? parseInt(time.slice(0, -6)) : 0
let timezone let timezone
if (timezones.has(profile)) timezone = timezones.get(profile) if (tzOffset !== null) {
else { timezone = FixedOffsetZone.instance(tzOffset)
} else if (timezones.has(profile)) {
timezone = timezones.get(profile)
} else {
timezone = new IANAZone(profile.timezone) timezone = new IANAZone(profile.timezone)
timezones.set(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(':'), { let dt = DateTime.fromISO(pDate.join('-') + 'T' + pTime.join(':'), {
locale: profile.locale, locale: profile.locale,
zone: timezone zone: timezone
}) })
if (daysOffset > 0) dt = dt.plus({days: daysOffset}) if (daysOffset > 0) dt = dt.plus({days: daysOffset})
return timestamp ? dt.toMillis() : dt.toISO() return timestamp ? dt.toMillis() : dt.toISO()
}
} }
module.exports = parseDateTime module.exports = parseDateTime

View file

@ -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, false], '2019-03-20T13:19:10.000+01:00')
assert(['20190318', '02131910', null, true], +new Date('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() t.end()
}) })