db-vendo-client/parse/date-time.js
Kristjan ESPERANTO 66d9fb5194
apply linting rules
follow-up of 228c7253
2024-02-10 16:50:12 +01:00

49 lines
1.3 KiB
JavaScript

import {DateTime, FixedOffsetZone, IANAZone} from 'luxon';
import {luxonIANAZonesByProfile as timezones} from '../lib/luxon-timezones.js';
const parseDaysOffset = (_, time) => {
return time.length > 6
? parseInt(time.slice(0, -6))
: 0;
};
const parseDateTime = (ctx, date, time, tzOffset = null, timestamp = false) => {
const {profile} = ctx;
const pDate = [date.substr(-8, 4), date.substr(-4, 2), date.substr(-2, 2)];
if (!pDate[0] || !pDate[1] || !pDate[2]) {
throw new Error('invalid date format: ' + date);
}
const pTime = [time.substr(-6, 2), time.substr(-4, 2), time.substr(-2, 2)];
if (!pTime[0] || !pTime[1] || !pTime[2]) {
throw new Error('invalid time format: ' + time);
}
const daysOffset = parseDaysOffset(ctx, time);
let timezone;
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);
}
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({suppressMilliseconds: true});
};
export {
parseDateTime,
};