moment
Version:
Parse, validate, manipulate, and display dates
81 lines (68 loc) • 2.49 kB
JavaScript
import { daysInYear } from './year';
import { createUTCDate } from '../create/date-from-array';
// start-of-first-week - start-of-year
function firstWeekOffset(year, dow, doy) {
var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
fwd = 7 + dow - doy,
// first-week day local weekday -- which local weekday is fwd
fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
return -fwdlw + fwd - 1;
}
// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
export function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
var localWeekday = (7 + weekday - dow) % 7,
weekOffset = firstWeekOffset(year, dow, doy),
dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
resYear,
resDayOfYear;
if (dayOfYear <= 0) {
resYear = year - 1;
resDayOfYear = daysInYear(resYear) + dayOfYear;
} else if (dayOfYear > daysInYear(year)) {
resYear = year + 1;
resDayOfYear = dayOfYear - daysInYear(year);
} else {
resYear = year;
resDayOfYear = dayOfYear;
}
return {
year: resYear,
dayOfYear: resDayOfYear,
};
}
function weekOfYearFromDayOfYear(year, dayOfYear, dow, doy) {
var weekOffset = firstWeekOffset(year, dow, doy),
week = Math.floor((dayOfYear - weekOffset - 1) / 7) + 1,
resWeek,
resYear;
if (week < 1) {
resYear = year - 1;
resWeek = week + weeksInYear(resYear, dow, doy);
} else if (week > weeksInYear(year, dow, doy)) {
resWeek = week - weeksInYear(year, dow, doy);
resYear = year + 1;
} else {
resYear = year;
resWeek = week;
}
return {
week: resWeek,
year: resYear,
};
}
export function weekOfYear(mom, dow, doy) {
return weekOfYearFromDayOfYear(mom.year(), mom.dayOfYear(), dow, doy);
}
export function weekOfYearFromDate(year, month, date, dow, doy) {
var dayOfYear =
Math.round(
(createUTCDate(year, month, date) - createUTCDate(year, 0, 1)) /
864e5
) + 1;
return weekOfYearFromDayOfYear(year, dayOfYear, dow, doy);
}
export function weeksInYear(year, dow, doy) {
var weekOffset = firstWeekOffset(year, dow, doy),
weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
}