DateParser.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { numericPatterns } from "../constants.js";
  2. import { Parser } from "../Parser.js";
  3. import {
  4. isLeapYearIndex,
  5. parseNDigits,
  6. parseNumericPattern,
  7. } from "../utils.js";
  8. const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  9. const DAYS_IN_MONTH_LEAP_YEAR = [
  10. 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
  11. ];
  12. // Day of the month
  13. export class DateParser extends Parser {
  14. priority = 90;
  15. subPriority = 1;
  16. parse(dateString, token, match) {
  17. switch (token) {
  18. case "d":
  19. return parseNumericPattern(numericPatterns.date, dateString);
  20. case "do":
  21. return match.ordinalNumber(dateString, { unit: "date" });
  22. default:
  23. return parseNDigits(token.length, dateString);
  24. }
  25. }
  26. validate(date, value) {
  27. const year = date.getFullYear();
  28. const isLeapYear = isLeapYearIndex(year);
  29. const month = date.getMonth();
  30. if (isLeapYear) {
  31. return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];
  32. } else {
  33. return value >= 1 && value <= DAYS_IN_MONTH[month];
  34. }
  35. }
  36. set(date, _flags, value) {
  37. date.setDate(value);
  38. date.setHours(0, 0, 0, 0);
  39. return date;
  40. }
  41. incompatibleTokens = [
  42. "Y",
  43. "R",
  44. "q",
  45. "Q",
  46. "w",
  47. "I",
  48. "D",
  49. "i",
  50. "e",
  51. "c",
  52. "t",
  53. "T",
  54. ];
  55. }