a72bdbfdef51fc7b43555725ac553f9d862059b061d0f118590b3f3da850b614aab2644f06b2c5b4b697ebf043806e9487c51e194d1104027390e2f40fb08e 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { daysInYear } from './year';
  2. import { createLocal } from '../create/local';
  3. import { createUTCDate } from '../create/date-from-array';
  4. // start-of-first-week - start-of-year
  5. function firstWeekOffset(year, dow, doy) {
  6. var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
  7. fwd = 7 + dow - doy,
  8. // first-week day local weekday -- which local weekday is fwd
  9. fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
  10. return -fwdlw + fwd - 1;
  11. }
  12. //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
  13. export function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
  14. var localWeekday = (7 + weekday - dow) % 7,
  15. weekOffset = firstWeekOffset(year, dow, doy),
  16. dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
  17. resYear, 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, resYear;
  37. if (week < 1) {
  38. resYear = mom.year() - 1;
  39. resWeek = week + weeksInYear(resYear, dow, doy);
  40. } else if (week > weeksInYear(mom.year(), dow, doy)) {
  41. resWeek = week - weeksInYear(mom.year(), dow, doy);
  42. resYear = mom.year() + 1;
  43. } else {
  44. resYear = mom.year();
  45. resWeek = week;
  46. }
  47. return {
  48. week: resWeek,
  49. year: resYear
  50. };
  51. }
  52. export function weeksInYear(year, dow, doy) {
  53. var weekOffset = firstWeekOffset(year, dow, doy),
  54. weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
  55. return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
  56. }