2013-05-16 2 views
16

Как я могу рассчитать дату в javascript, зная номер недели и год? За неделю число 20 и 2013 год, чтобы получить 5/16/2013 Я пытаюсь так:javascript рассчитать дату с текущей недели

Date.prototype.dayofYear = function() {   
    var d = new Date(this.getFullYear(), 0, 0);   
    return Math.floor((enter code here this - d)/8.64e + 7); 
} 
+0

Вы должны быть в состоянии найти ответ здесь: http://stackoverflow.com/questions/6117814/get-week-of-year-in -javascript-like-in-php - просто в Google. –

+0

Я хочу разворот. зная номер недели, дату получения. – user2369009

+0

Ответы ниже соответствуют вашему запросу Javascript-кода, но FWIW, библиотека momentjs обрабатывает это красиво. Для идентификационных номеров ISO 8601, 'moment (" 2013W20 ")' дает: '" 2013-05-13T00: 00: 00-06: 00 "'. –

ответ

42
function getDateOfWeek(w, y) { 
    var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week 

    return new Date(y, 0, d); 
} 

Это использует simple week definition, то есть 20-й недели 2013 14. Май

Чтобы вычислить дату начала данного ISO8601 week (который всегда будет понедельник)

function getDateOfISOWeek(w, y) { 
    var simple = new Date(y, 0, 1 + (w - 1) * 7); 
    var dow = simple.getDay(); 
    var ISOweekStart = simple; 
    if (dow <= 4) 
     ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1); 
    else 
     ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay()); 
    return ISOweekStart; 
} 

Результат: 20-я неделя 2013 года - 13 мая, которая может быть подтверждена here.

+1

это не работая, например, в первую неделю 2009 года, которая должна начаться 29 декабря 2008 года, и ваш метод возвращается 5 января – Marcin

+0

Я считаю, что 'dow <4' должно быть' dow <= 4', но я его не проверил полностью. –

+0

Да, неделя ИСО начинается в году, когда первый четверг на этой неделе. Так что если dow - 4, значит, начинается неделя. <= решит эту проблему. – Marcin

3
function getDateOfWeek(weekNumber,year){ 
    //Create a date object starting january first of chosen year, plus the number of days in a week multiplied by the week number to get the right date. 
    return new Date(year, 0, 1+((weekNumber-1)*7)); 
} 
var myDate = getDateOfWeek(20,2013); 
+1

Месяц должен начинаться с 0: http://stackoverflow.com/questions/1208519/javascript-date-objects-month-index-begins-with-0 –

+0

Вы правы, я исправил свой пост, спасибо – Salketer

6

ISO Weeks

function weekDateToDate (year, week, day) { 
    const firstDayOfYear = new Date(year, 0, 1) 
    const days = 2 + day + (week - 1) * 7 - firstDayOfYear.getDay() 
    return new Date(year, 0, days) 
} 
+1

** Это неправильно **: 'weekDateToDate (2016, 52, 7)' дает '2016-12-26', а не' 2017-01-01' – adius

+0

Не следует за ISO 8601 неделями. Не знаете, какие ИСО недели вы говорите. – lindhe

3

Извините, если это немного многословным, но это решение также будет возвращать в воскресенье после расчета номера недели. Он сочетает в себе ответы, я видел из пары разных мест:

диапазона
function getSundayFromWeekNum(weekNum, year) { 
    var sunday = new Date(year, 0, (1 + (weekNum - 1) * 7)); 
    while (sunday.getDay() !== 0) { 
     sunday.setDate(sunday.getDate() - 1); 
    } 
    return sunday; 
} 
1

Получить дату в соответствии с номером недели

Date.prototype.getWeek = function() { 
    var target = new Date(this.valueOf()); 
    var dayNr = (this.getDay() + 6) % 7; 
    target.setDate(target.getDate() - dayNr + 3); 
    var firstThursday = target.valueOf(); 
    target.setMonth(0, 1); 
    if (target.getDay() != 4) { 
     target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7); 
    } 
    return 1 + Math.ceil((firstThursday - target)/604800000); 
} 

function getDateRangeOfWeek(weekNo){ 
    var d1 = new Date(); 
    numOfdaysPastSinceLastMonday = eval(d1.getDay()- 1); 
    d1.setDate(d1.getDate() - numOfdaysPastSinceLastMonday); 
    var weekNoToday = d1.getWeek(); 
    var weeksInTheFuture = eval(weekNo - weekNoToday); 
    d1.setDate(d1.getDate() + eval(7 * weeksInTheFuture)); 
    var rangeIsFrom = eval(d1.getMonth()+1) +"/" + d1.getDate() + "/" + d1.getFullYear(); 
    d1.setDate(d1.getDate() + 6); 
    var rangeIsTo = eval(d1.getMonth()+1) +"/" + d1.getDate() + "/" + d1.getFullYear() ; 
    return rangeIsFrom + " to "+rangeIsTo; 
}; 

getDateRangeOfWeek(10) 
"3/6/2017 to 3/12/2017" 

getDateRangeOfWeek(30) 
"7/24/2017 to 7/30/2017" 
+0

Прекрасный дорогой :) Я просто хотел этого. –

0

ISO Дата недели (например, 2017-W32-3) к нормальной дате:

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) 
 
    })

0

Это для получения первого м onday за неделю в текущем году (ISO 8601):

function getFirstMondayOfWeek(weekNo) { 
    var firstMonday = new Date(new Date().getFullYear(), 0, 4, 0, 0, 0, 0); 

    while (firstMonday.getDay() != 1) { 
     firstMonday.setDate(firstMonday.getDate() - 1); 
    } 
    if (1 <= weekNo && weekNo <= 52) 
     return firstMonday.setDate(firstMonday.getDate() + 7 * (weekNo - 1)); 

    firstMonday.setDate(firstMonday.getDate() + 7 * (weekNo - 1)); 
    if (weekNo = 53 && firstMonday.getDate() >= 22 && firstMonday.getDate() <= 28) 
     return firstMonday; 
    return null; 
}