utils.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import {
  2. millisecondsInHour,
  3. millisecondsInMinute,
  4. millisecondsInSecond,
  5. } from "../../constants.js";
  6. import { numericPatterns } from "./constants.js";
  7. export function mapValue(parseFnResult, mapFn) {
  8. if (!parseFnResult) {
  9. return parseFnResult;
  10. }
  11. return {
  12. value: mapFn(parseFnResult.value),
  13. rest: parseFnResult.rest,
  14. };
  15. }
  16. export function parseNumericPattern(pattern, dateString) {
  17. const matchResult = dateString.match(pattern);
  18. if (!matchResult) {
  19. return null;
  20. }
  21. return {
  22. value: parseInt(matchResult[0], 10),
  23. rest: dateString.slice(matchResult[0].length),
  24. };
  25. }
  26. export function parseTimezonePattern(pattern, dateString) {
  27. const matchResult = dateString.match(pattern);
  28. if (!matchResult) {
  29. return null;
  30. }
  31. // Input is 'Z'
  32. if (matchResult[0] === "Z") {
  33. return {
  34. value: 0,
  35. rest: dateString.slice(1),
  36. };
  37. }
  38. const sign = matchResult[1] === "+" ? 1 : -1;
  39. const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;
  40. const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;
  41. const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;
  42. return {
  43. value:
  44. sign *
  45. (hours * millisecondsInHour +
  46. minutes * millisecondsInMinute +
  47. seconds * millisecondsInSecond),
  48. rest: dateString.slice(matchResult[0].length),
  49. };
  50. }
  51. export function parseAnyDigitsSigned(dateString) {
  52. return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);
  53. }
  54. export function parseNDigits(n, dateString) {
  55. switch (n) {
  56. case 1:
  57. return parseNumericPattern(numericPatterns.singleDigit, dateString);
  58. case 2:
  59. return parseNumericPattern(numericPatterns.twoDigits, dateString);
  60. case 3:
  61. return parseNumericPattern(numericPatterns.threeDigits, dateString);
  62. case 4:
  63. return parseNumericPattern(numericPatterns.fourDigits, dateString);
  64. default:
  65. return parseNumericPattern(new RegExp("^\\d{1," + n + "}"), dateString);
  66. }
  67. }
  68. export function parseNDigitsSigned(n, dateString) {
  69. switch (n) {
  70. case 1:
  71. return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);
  72. case 2:
  73. return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);
  74. case 3:
  75. return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);
  76. case 4:
  77. return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);
  78. default:
  79. return parseNumericPattern(new RegExp("^-?\\d{1," + n + "}"), dateString);
  80. }
  81. }
  82. export function dayPeriodEnumToHours(dayPeriod) {
  83. switch (dayPeriod) {
  84. case "morning":
  85. return 4;
  86. case "evening":
  87. return 17;
  88. case "pm":
  89. case "noon":
  90. case "afternoon":
  91. return 12;
  92. case "am":
  93. case "midnight":
  94. case "night":
  95. default:
  96. return 0;
  97. }
  98. }
  99. export function normalizeTwoDigitYear(twoDigitYear, currentYear) {
  100. const isCommonEra = currentYear > 0;
  101. // Absolute number of the current year:
  102. // 1 -> 1 AC
  103. // 0 -> 1 BC
  104. // -1 -> 2 BC
  105. const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;
  106. let result;
  107. if (absCurrentYear <= 50) {
  108. result = twoDigitYear || 100;
  109. } else {
  110. const rangeEnd = absCurrentYear + 50;
  111. const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;
  112. const isPreviousCentury = twoDigitYear >= rangeEnd % 100;
  113. result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);
  114. }
  115. return isCommonEra ? result : 1 - result;
  116. }
  117. export function isLeapYearIndex(year) {
  118. return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);
  119. }