utils.js 3.4 KB

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