DayOfYearParser.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. export class DayOfYearParser extends Parser {
  9. priority = 90;
  10. subpriority = 1;
  11. parse(dateString, token, match) {
  12. switch (token) {
  13. case "D":
  14. case "DD":
  15. return parseNumericPattern(numericPatterns.dayOfYear, dateString);
  16. case "Do":
  17. return match.ordinalNumber(dateString, { unit: "date" });
  18. default:
  19. return parseNDigits(token.length, dateString);
  20. }
  21. }
  22. validate(date, value) {
  23. const year = date.getFullYear();
  24. const isLeapYear = isLeapYearIndex(year);
  25. if (isLeapYear) {
  26. return value >= 1 && value <= 366;
  27. } else {
  28. return value >= 1 && value <= 365;
  29. }
  30. }
  31. set(date, _flags, value) {
  32. date.setMonth(0, value);
  33. date.setHours(0, 0, 0, 0);
  34. return date;
  35. }
  36. incompatibleTokens = [
  37. "Y",
  38. "R",
  39. "q",
  40. "Q",
  41. "M",
  42. "L",
  43. "w",
  44. "I",
  45. "d",
  46. "E",
  47. "i",
  48. "e",
  49. "c",
  50. "t",
  51. "T",
  52. ];
  53. }