utils.js 3.9 KB

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