UNPKG

@3mo/date-time-fields

Version:

Date time fields let people select dates, date-ranges, and times.

37 lines (36 loc) 2.34 kB
export class DateRangeParser { static parse(dateRangeText, referenceDate = new DateTime) { const keywordResult = DateRangeParser.parseDateRangeFromKeyword(dateRangeText, referenceDate); if (keywordResult) { return keywordResult; } let separator = DateRangeParser.userDateRangeSeparators.find(separator => dateRangeText.includes(separator)); if (!separator) { dateRangeText += DateRangeParser.dateRangeSeparator; separator = DateRangeParser.dateRangeSeparator; } const [startDateText, endDateText] = dateRangeText.toLowerCase().split(separator); const startDate = DateTime.parseAsDateTime(startDateText, referenceDate); const endDate = DateTime.parseAsDateTime(endDateText, referenceDate); return new DateTimeRange(startDate, endDate); } static parseDateRangeFromKeyword(keyword, referenceDate = new DateTime) { switch (keyword) { case 'w': case 'dw': return new DateTimeRange(referenceDate.weekStart, referenceDate.weekEnd); case 'nw': return new DateTimeRange(referenceDate.add({ weeks: +1 }).weekStart, referenceDate.add({ weeks: +1 }).weekEnd); case 'lw': return new DateTimeRange(referenceDate.add({ weeks: -1 }).weekStart, referenceDate.add({ weeks: -1 }).weekEnd); case 'm': case 'dm': return new DateTimeRange(referenceDate.monthStart, referenceDate.monthEnd); case 'lm': return new DateTimeRange(referenceDate.add({ months: -1 }).monthStart, referenceDate.add({ months: -1 }).monthEnd); case 'nm': return new DateTimeRange(referenceDate.add({ months: +1 }).monthStart, referenceDate.add({ months: +1 }).monthEnd); case 'j': case 'dj': return new DateTimeRange(referenceDate.yearStart, referenceDate.yearEnd); case 'lj': return new DateTimeRange(referenceDate.add({ years: -1 }).yearStart, referenceDate.add({ years: -1 }).yearEnd); case 'nj': return new DateTimeRange(referenceDate.add({ years: +1 }).yearStart, referenceDate.add({ years: +1 }).yearEnd); default: return undefined; } } } DateRangeParser.dateRangeSeparator = ' – '; DateRangeParser.userDateRangeSeparators = [DateRangeParser.dateRangeSeparator, ' ', '-', '~'];