Created
October 20, 2021 16:01
-
-
Save oliverfernandez/a670aa9d1d51563316ed41bc935f047a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const FIRST_MONTH_OF_THE_YEAR = 0; | |
const FIRST_DAY_OF_THE_MONTH = 1; | |
const DAYS_IN_A_WEEK = 7; | |
const THURSDAY_DAY_OF_THE_WEEK = 4; | |
const SUNDAY_DAY_OF_THE_WEEK = 7; | |
const TEN_DAYS_MILISECONDS = 86400000; | |
export type WeekOfYear = { | |
week: number; | |
year: number; | |
}; | |
/** | |
* @see https://en.wikipedia.org/wiki/ISO_week_date | |
* @see https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php | |
*/ | |
export function getWeekOfYear(date: Date): WeekOfYear { | |
const dateUTC = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); | |
const nearestThursday = new Date(Date.UTC( | |
dateUTC.getFullYear(), | |
dateUTC.getMonth(), | |
dateUTC.getDate() + THURSDAY_DAY_OF_THE_WEEK - (dateUTC.getUTCDay() || SUNDAY_DAY_OF_THE_WEEK) | |
)); | |
const firstDayOfYear = new Date(Date.UTC( | |
nearestThursday.getFullYear(), | |
FIRST_MONTH_OF_THE_YEAR, | |
FIRST_DAY_OF_THE_MONTH | |
)); | |
const weekNumber = Math.ceil( | |
(((nearestThursday.getTime() - firstDayOfYear.getTime()) / TEN_DAYS_MILISECONDS) + 1) / DAYS_IN_A_WEEK | |
); | |
return { | |
week: weekNumber, | |
year: nearestThursday.getUTCFullYear() | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment