week-year.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { addFormatToken } from '../format/format';
  2. import { addUnitAlias } from './aliases';
  3. import { addUnitPriority } from './priorities';
  4. import {
  5. addRegexToken,
  6. match1to2,
  7. match1to4,
  8. match1to6,
  9. match2,
  10. match4,
  11. match6,
  12. matchSigned,
  13. } from '../parse/regex';
  14. import { addWeekParseToken } from '../parse/token';
  15. import {
  16. weekOfYear,
  17. weeksInYear,
  18. dayOfYearFromWeeks,
  19. } from './week-calendar-utils';
  20. import toInt from '../utils/to-int';
  21. import { hooks } from '../utils/hooks';
  22. import { createUTCDate } from '../create/date-from-array';
  23. // FORMATTING
  24. addFormatToken(0, ['gg', 2], 0, function () {
  25. return this.weekYear() % 100;
  26. });
  27. addFormatToken(0, ['GG', 2], 0, function () {
  28. return this.isoWeekYear() % 100;
  29. });
  30. function addWeekYearFormatToken(token, getter) {
  31. addFormatToken(0, [token, token.length], 0, getter);
  32. }
  33. addWeekYearFormatToken('gggg', 'weekYear');
  34. addWeekYearFormatToken('ggggg', 'weekYear');
  35. addWeekYearFormatToken('GGGG', 'isoWeekYear');
  36. addWeekYearFormatToken('GGGGG', 'isoWeekYear');
  37. // ALIASES
  38. addUnitAlias('weekYear', 'gg');
  39. addUnitAlias('isoWeekYear', 'GG');
  40. // PRIORITY
  41. addUnitPriority('weekYear', 1);
  42. addUnitPriority('isoWeekYear', 1);
  43. // PARSING
  44. addRegexToken('G', matchSigned);
  45. addRegexToken('g', matchSigned);
  46. addRegexToken('GG', match1to2, match2);
  47. addRegexToken('gg', match1to2, match2);
  48. addRegexToken('GGGG', match1to4, match4);
  49. addRegexToken('gggg', match1to4, match4);
  50. addRegexToken('GGGGG', match1to6, match6);
  51. addRegexToken('ggggg', match1to6, match6);
  52. addWeekParseToken(
  53. ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
  54. function (input, week, config, token) {
  55. week[token.substr(0, 2)] = toInt(input);
  56. }
  57. );
  58. addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
  59. week[token] = hooks.parseTwoDigitYear(input);
  60. });
  61. // MOMENTS
  62. export function getSetWeekYear(input) {
  63. return getSetWeekYearHelper.call(
  64. this,
  65. input,
  66. this.week(),
  67. this.weekday(),
  68. this.localeData()._week.dow,
  69. this.localeData()._week.doy
  70. );
  71. }
  72. export function getSetISOWeekYear(input) {
  73. return getSetWeekYearHelper.call(
  74. this,
  75. input,
  76. this.isoWeek(),
  77. this.isoWeekday(),
  78. 1,
  79. 4
  80. );
  81. }
  82. export function getISOWeeksInYear() {
  83. return weeksInYear(this.year(), 1, 4);
  84. }
  85. export function getISOWeeksInISOWeekYear() {
  86. return weeksInYear(this.isoWeekYear(), 1, 4);
  87. }
  88. export function getWeeksInYear() {
  89. var weekInfo = this.localeData()._week;
  90. return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
  91. }
  92. export function getWeeksInWeekYear() {
  93. var weekInfo = this.localeData()._week;
  94. return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
  95. }
  96. function getSetWeekYearHelper(input, week, weekday, dow, doy) {
  97. var weeksTarget;
  98. if (input == null) {
  99. return weekOfYear(this, dow, doy).year;
  100. } else {
  101. weeksTarget = weeksInYear(input, dow, doy);
  102. if (week > weeksTarget) {
  103. week = weeksTarget;
  104. }
  105. return setWeekAll.call(this, input, week, weekday, dow, doy);
  106. }
  107. }
  108. function setWeekAll(weekYear, week, weekday, dow, doy) {
  109. var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
  110. date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
  111. this.year(date.getUTCFullYear());
  112. this.month(date.getUTCMonth());
  113. this.date(date.getUTCDate());
  114. return this;
  115. }