@@ -5,24 +5,28 @@ export default class HTMLInputElementDateUtility {
55 /**
66 * Returns iso week number from given date
77 *
8+ * @see https://stackoverflow.com/a/6117889
89 * @param date Date or number.
910 * @returns Iso-week string.
1011 */
1112 public static dateIsoWeek ( date : Date | number ) : string {
12- date = new Date ( date ) ;
13- const day = ( date . getUTCDay ( ) + 6 ) % 7 ;
14- date . setUTCDate ( date . getUTCDate ( ) - day + 3 ) ;
15- const firstThursday = date . getTime ( ) ;
16- date . setUTCMonth ( 0 , 1 ) ;
17- if ( date . getUTCDay ( ) !== 4 ) {
18- date . setUTCMonth ( 0 , 1 + ( ( 4 - date . getUTCDay ( ) + 7 ) % 7 ) ) ;
19- }
20- return (
21- date . getUTCFullYear ( ) +
22- '-W' +
23- String ( 1 + Math . ceil ( ( firstThursday - date . getTime ( ) ) / 604800000 ) ) . padStart ( 2 , '0' )
13+ const parsedDate = typeof date === 'number' ? new Date ( date ) : date ;
14+ // Copy date so don't modify original
15+ const newDate = new Date (
16+ Date . UTC ( parsedDate . getFullYear ( ) , parsedDate . getMonth ( ) , parsedDate . getDate ( ) )
17+ ) ;
18+ // Set to nearest Thursday: current date + 4 - current day number
19+ // Make Sunday's day number 7
20+ newDate . setUTCDate ( newDate . getUTCDate ( ) + 4 - ( newDate . getUTCDay ( ) || 7 ) ) ;
21+ // Get first day of year
22+ const yearStart = new Date ( Date . UTC ( newDate . getUTCFullYear ( ) , 0 , 1 ) ) ;
23+ // Calculate full weeks to nearest Thursday
24+ const weekNo = Math . ceil (
25+ ( ( < number > ( < unknown > newDate ) - < number > ( < unknown > yearStart ) ) / 86400000 + 1 ) / 7
2426 ) ;
27+ return `${ newDate . getUTCFullYear ( ) } -W${ weekNo < 10 ? '0' : '' } ${ weekNo } ` ;
2528 }
29+
2630 /**
2731 * Returns a date object for monday of given iso week string (\d\d\d\d-W\d\d)
2832 *
0 commit comments