1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { numericPatterns } from "../constants.js";
- import { Parser } from "../Parser.js";
- import {
- isLeapYearIndex,
- parseNDigits,
- parseNumericPattern,
- } from "../utils.js";
- const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
- const DAYS_IN_MONTH_LEAP_YEAR = [
- 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
- ];
- // Day of the month
- export class DateParser extends Parser {
- priority = 90;
- subPriority = 1;
- parse(dateString, token, match) {
- switch (token) {
- case "d":
- return parseNumericPattern(numericPatterns.date, dateString);
- case "do":
- return match.ordinalNumber(dateString, { unit: "date" });
- default:
- return parseNDigits(token.length, dateString);
- }
- }
- validate(date, value) {
- const year = date.getFullYear();
- const isLeapYear = isLeapYearIndex(year);
- const month = date.getMonth();
- if (isLeapYear) {
- return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];
- } else {
- return value >= 1 && value <= DAYS_IN_MONTH[month];
- }
- }
- set(date, _flags, value) {
- date.setDate(value);
- date.setHours(0, 0, 0, 0);
- return date;
- }
- incompatibleTokens = [
- "Y",
- "R",
- "q",
- "Q",
- "w",
- "I",
- "D",
- "i",
- "e",
- "c",
- "t",
- "T",
- ];
- }
|