LocalWeekYearParser.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { getWeekYear } from "../../../getWeekYear.js";
  2. import { startOfWeek } from "../../../startOfWeek.js";
  3. import { Parser } from "../Parser.js";
  4. import { mapValue, normalizeTwoDigitYear, parseNDigits } from "../utils.js";
  5. // Local week-numbering year
  6. export class LocalWeekYearParser extends Parser {
  7. priority = 130;
  8. parse(dateString, token, match) {
  9. const valueCallback = (year) => ({
  10. year,
  11. isTwoDigitYear: token === "YY",
  12. });
  13. switch (token) {
  14. case "Y":
  15. return mapValue(parseNDigits(4, dateString), valueCallback);
  16. case "Yo":
  17. return mapValue(
  18. match.ordinalNumber(dateString, {
  19. unit: "year",
  20. }),
  21. valueCallback,
  22. );
  23. default:
  24. return mapValue(parseNDigits(token.length, dateString), valueCallback);
  25. }
  26. }
  27. validate(_date, value) {
  28. return value.isTwoDigitYear || value.year > 0;
  29. }
  30. set(date, flags, value, options) {
  31. const currentYear = getWeekYear(date, options);
  32. if (value.isTwoDigitYear) {
  33. const normalizedTwoDigitYear = normalizeTwoDigitYear(
  34. value.year,
  35. currentYear,
  36. );
  37. date.setFullYear(
  38. normalizedTwoDigitYear,
  39. 0,
  40. options.firstWeekContainsDate,
  41. );
  42. date.setHours(0, 0, 0, 0);
  43. return startOfWeek(date, options);
  44. }
  45. const year =
  46. !("era" in flags) || flags.era === 1 ? value.year : 1 - value.year;
  47. date.setFullYear(year, 0, options.firstWeekContainsDate);
  48. date.setHours(0, 0, 0, 0);
  49. return startOfWeek(date, options);
  50. }
  51. incompatibleTokens = [
  52. "y",
  53. "R",
  54. "u",
  55. "Q",
  56. "q",
  57. "M",
  58. "L",
  59. "I",
  60. "d",
  61. "D",
  62. "i",
  63. "t",
  64. "T",
  65. ];
  66. }