const getZeroBasedIsoWeekDay = date => (date.getDay() + 6) % 7
const getIsoWeekDay = date => getZeroBasedIsoWeekDay(date) + 1
function weekDateToDate(year, week, weekDay) {
const zeroBasedWeek = week - 1
const zeroBasedWeekDay = weekDay - 1
let days = (zeroBasedWeek * 7) + zeroBasedWeekDay
// Dates start at 2017-01-01 and not 2017-01-00
days += 1
const firstDayOfYear = new Date(year, 0, 1)
const firstIsoWeekDay = getIsoWeekDay(firstDayOfYear)
const zeroBasedFirstIsoWeekDay = getZeroBasedIsoWeekDay(firstDayOfYear)
// If year begins with W52 or W53
if (firstIsoWeekDay > 4) days += 8 - firstIsoWeekDay
// Else begins with W01
else days -= zeroBasedFirstIsoWeekDay
return new Date(year, 0, days)
}
const expectedAndActual = [
[new Date('2007-01-01'), weekDateToDate(2007, 1, 1)],
[new Date('2015-11-24'), weekDateToDate(2015, 48, 2)],
[new Date('2015-12-31'), weekDateToDate(2015, 53, 4)],
[new Date('2016-01-03'), weekDateToDate(2015, 53, 7)],
[new Date('2017-01-01'), weekDateToDate(2016, 52, 7)],
[new Date('2017-01-02'), weekDateToDate(2017, 1, 1)],
[new Date('2017-05-07'), weekDateToDate(2017, 18, 7)],
[new Date('2018-12-31'), weekDateToDate(2019, 1, 1)],
]
expectedAndActual
.forEach(value => {
const expected = value[0].toISOString()
const actual = value[1].toISOString()
const isEqual = actual === expected
console.assert(isEqual, '%s !== %s', actual, expected)
console.log(actual, '===', expected)
})
Вы должны быть в состоянии найти ответ здесь: http://stackoverflow.com/questions/6117814/get-week-of-year-in -javascript-like-in-php - просто в Google. –
Я хочу разворот. зная номер недели, дату получения. – user2369009
Ответы ниже соответствуют вашему запросу Javascript-кода, но FWIW, библиотека momentjs обрабатывает это красиво. Для идентификационных номеров ISO 8601, 'moment (" 2013W20 ")' дает: '" 2013-05-13T00: 00: 00-06: 00 "'. –