b126b57a5b17bbbd77e1dab46623f1c5c5a6ce9217e26b761369b17fcf1481c22969909312fdb63c0fa674d6901875411e267988ae5b2abf57dd20aa1ccefe 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { daysInYear } from './year';
  2. import { createUTCDate } from '../create/date-from-array';
  3. // start-of-first-week - start-of-year
  4. function firstWeekOffset(year, dow, doy) {
  5. var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
  6. fwd = 7 + dow - doy,
  7. // first-week day local weekday -- which local weekday is fwd
  8. fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
  9. return -fwdlw + fwd - 1;
  10. }
  11. // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
  12. export function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
  13. var localWeekday = (7 + weekday - dow) % 7,
  14. weekOffset = firstWeekOffset(year, dow, doy),
  15. dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
  16. resYear,
  17. resDayOfYear;
  18. if (dayOfYear <= 0) {
  19. resYear = year - 1;
  20. resDayOfYear = daysInYear(resYear) + dayOfYear;
  21. } else if (dayOfYear > daysInYear(year)) {
  22. resYear = year + 1;
  23. resDayOfYear = dayOfYear - daysInYear(year);
  24. } else {
  25. resYear = year;
  26. resDayOfYear = dayOfYear;
  27. }
  28. return {
  29. year: resYear,
  30. dayOfYear: resDayOfYear,
  31. };
  32. }
  33. export function weekOfYear(mom, dow, doy) {
  34. var weekOffset = firstWeekOffset(mom.year(), dow, doy),
  35. week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
  36. resWeek,
  37. resYear;
  38. if (week < 1) {
  39. resYear = mom.year() - 1;
  40. resWeek = week + weeksInYear(resYear, dow, doy);
  41. } else if (week > weeksInYear(mom.year(), dow, doy)) {
  42. resWeek = week - weeksInYear(mom.year(), dow, doy);
  43. resYear = mom.year() + 1;
  44. } else {
  45. resYear = mom.year();
  46. resWeek = week;
  47. }
  48. return {
  49. week: resWeek,
  50. year: resYear,
  51. };
  52. }
  53. export function weeksInYear(year, dow, doy) {
  54. var weekOffset = firstWeekOffset(year, dow, doy),
  55. weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
  56. return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
  57. }