Как я могу найти неделю, к которой относится день, используя javascript? - PullRequest
0 голосов
/ 31 октября 2009

Я хочу найти номер недели, к которой относится день, в javascript. Мое определение недели - это число суббот, которое было до этой даты. Таким образом, первые несколько дней января считаются последней неделей предыдущего года. Оттуда первая суббота предшествующей пятницы - неделя 0 (подсчет 0 на основе недели).

Кто-нибудь знает, как реализовать такую ​​функцию?

Ответы [ 4 ]

4 голосов
/ 31 октября 2009

Это

function week(date) {
    var firstSat = new Date(date.getFullYear(), 0, 1);
    firstSat.setDate(firstSat.getDate() + (6 - firstSat.getDay()));

    var delta = Math.floor((date - firstSat) / (7*24*60*60*1000));

    return delta < 0 ?
           delta + 52 : // first few days before 1st Sat
           delta
}

week(new Date(2009,0,1)); // Jan 1, 2009 => 51 => "1 week into last year"
week(new Date(2009,0,2)); // 51
week(new Date(2009,0,3)); // 0 => "[beginning of] week 1"
week(new Date(2009,0,10)); // 1 => "[beginning of] week 2"
week(new Date(2009,0,11)); // 1 => "still week 2"
week(new Date(2009, 9, 30)); // Fri Oct 30, 2009 => 42
1 голос
/ 31 октября 2009

Оформить заказ http://www.datejs.com/

0 голосов
/ 31 октября 2009

В итоге я пошел за:

Date.prototype.getWeek = function()
{
 var localOffset = this.getTimezoneOffset() * 60000;
 var date = new Date(this-localOffset);
 var firstSat = new Date(this);
 firstSat.setDate(1);
 firstSat.setMonth(0);
 firstSat.setDate(firstSat.getDate() + (6 - firstSat.getDay()));

 if(date < firstSat)
 {
  date.setDate(date.getDate()-7);
  return date.getWeek()+1;
 }
 else
 {
  return Math.floor((date - firstSat) / (7*24*60*60*1000));
 }
}

Что устраняет проблемы со смещением UTC

0 голосов
/ 31 октября 2009
var getWeekForDate = function(date) {
  var yearStart = new Date(date.getFullYear(), 0, 0);

  // move to first Saturday
  yearStart.setDate(yearStart.getDate() + (6 - yearStart.getDay()));

  var msSinceStart = date - yearStart;
  var daysSinceStart = msSinceStart / (1000 * 60 * 60 * 24);
  var weeksSinceStart = daysSinceStart / 7;
  return Math.floor(weeksSinceStart);
};
...