getWeekYear.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { getDefaultOptions } from "./_lib/defaultOptions.js";
  2. import { constructFrom } from "./constructFrom.js";
  3. import { startOfWeek } from "./startOfWeek.js";
  4. import { toDate } from "./toDate.js";
  5. /**
  6. * The {@link getWeekYear} function options.
  7. */
  8. /**
  9. * @name getWeekYear
  10. * @category Week-Numbering Year Helpers
  11. * @summary Get the local week-numbering year of the given date.
  12. *
  13. * @description
  14. * Get the local week-numbering year of the given date.
  15. * The exact calculation depends on the values of
  16. * `options.weekStartsOn` (which is the index of the first day of the week)
  17. * and `options.firstWeekContainsDate` (which is the day of January, which is always in
  18. * the first week of the week-numbering year)
  19. *
  20. * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
  21. *
  22. * @param date - The given date
  23. * @param options - An object with options.
  24. *
  25. * @returns The local week-numbering year
  26. *
  27. * @example
  28. * // Which week numbering year is 26 December 2004 with the default settings?
  29. * const result = getWeekYear(new Date(2004, 11, 26))
  30. * //=> 2005
  31. *
  32. * @example
  33. * // Which week numbering year is 26 December 2004 if week starts on Saturday?
  34. * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })
  35. * //=> 2004
  36. *
  37. * @example
  38. * // Which week numbering year is 26 December 2004 if the first week contains 4 January?
  39. * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })
  40. * //=> 2004
  41. */
  42. export function getWeekYear(date, options) {
  43. const _date = toDate(date, options?.in);
  44. const year = _date.getFullYear();
  45. const defaultOptions = getDefaultOptions();
  46. const firstWeekContainsDate =
  47. options?.firstWeekContainsDate ??
  48. options?.locale?.options?.firstWeekContainsDate ??
  49. defaultOptions.firstWeekContainsDate ??
  50. defaultOptions.locale?.options?.firstWeekContainsDate ??
  51. 1;
  52. const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
  53. firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
  54. firstWeekOfNextYear.setHours(0, 0, 0, 0);
  55. const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
  56. const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
  57. firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
  58. firstWeekOfThisYear.setHours(0, 0, 0, 0);
  59. const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
  60. if (+_date >= +startOfNextYear) {
  61. return year + 1;
  62. } else if (+_date >= +startOfThisYear) {
  63. return year;
  64. } else {
  65. return year - 1;
  66. }
  67. }
  68. // Fallback for modularized imports:
  69. export default getWeekYear;