Как найти неделю месяца для календаря, который начинается с понедельника?

#javascript

#javascript

Вопрос:

У меня есть календарь, начинающийся с понедельника.

Май 2011

 ----------------------------
Mon Tue Wed Thu Fri Sat Sun
----------------------------
25  26  27  28  29  30   1     week 1
2   3   4    5   6   7   8     week 2
9   10  11  12  13  14   15    week 3
16  17  18  19  20  21   22    week 4
23  24  25  26  27  28   29    week 5
30  31  1   2    3  4     5    week 6
  

Я хочу найти неделю месяца по дате предоставления.

Приведенное ниже отлично работает в календаре, который начинается в воскресенье.

 function getWeekOfMonth(date) {

  prefixes = ['1', '2', '3', '4', '5'];
  return prefixes[0 | date.getDate() / 7];
}
  

Но в моем календаре (на основе понедельника), если я выберу 1 мая, возвращаемое значение, если «1»таким образом
выдает меня, "week2" но это должно быть "week1" .

Если я выберу 15 мая, укажите мне «week4» вместо «week3».

Это работает в таких случаях, как 12 мая.

Я попытался сместить этот разрыв в один день (понедельник и воскресенье) и изменил алгоритм, который не удался.

Кто-нибудь может показать мне, как я могу правильно исправить свой алгоритм?

 function getWeekOfMonth(date) {

  prefixes = ['1', '2', '3', '4', '5'];
  return prefixes[0 | date.getDate() - 1 / 7];
}
  

Комментарии:

1. если он дает вам неделю 1 на 1 мая, что он дает вам на 2 мая?

2. 2 мая дает мне неделю 1. Потому что, если это балендар, основанный на воскресеньях, с 1 по 7-ю будет неделя1.

3. итак, week0 — это первая неполная неделя?

4. да, я только что сделал на основе нуля, это может быть что угодно, но есть 6 недель, как вы можете видеть в календаре выше.

Ответ №1:

сначала вам нужно проверить, в какой день начинается месяц, затем добавить k, чтобы date.getDate() k равнялось 7 для первого понедельника месяца

тогда это довольно просто

 function getWeekOfMonth(date) {
  var adjustedDate = date.getDate() k;
  prefixes = ['0', '1', '2', '3', '4', '5'];
  return prefixes[0 | adjustedDate / 7];
}
  

Редактировать:

вы можете использовать getDay для поиска текущего дня недели и использовать его в связи с getDate для поиска понедельника текущей недели

 function getWeekOfMonth(date) {
  var day = date.getDate()
  day-=(date.getDay()==0?6:date.getDay()-1);//get monday of this week
  //special case handling for 0 (sunday)

  day =7;
  //for the first non full week the value was negative

  prefixes = ['0', '1', '2', '3', '4', '5'];
  return prefixes[0 | (day) / 7];
}
  

Комментарии:

1. на самом деле k не меняется от месяца к месяцу? вам нужно вычислить, где 1-й день?

2. нет, k — это значение сдвига, которое зависит от того, на сколько дней вы хотите сдвинуть свою неделю.

3. Я не совсем понимаю, что означает K? И если date.getDate() возвращает 12, 12 k = 7 ? итак, K =-5? действительно запутался…

Ответ №2:

(Когда я тестировал принятый ответ в этом сообщении, обнаружил, что он не работает в течение месяцев, где первый день месяца — понедельник или вторник. Но мой ответ в основном также основан на принятом ответе.)

Я думаю, что эта функция должна выполнить свою работу.

         function getWeekNo(date) {

            var day = date.getDate()

            //get weekend date
            day  = (date.getDay() == 0 ? 0 : 7 - date.getDay());

            return Math.ceil(parseFloat(day) / 7);
        }

        alert(getWeekNo(new Date(2015, 2, 31)));
  

Когда я тестировал, оказалось, что он дает правильные результаты для:

  1. Месяцы, где первый день месяца — понедельник, вторник или воскресенье
  2. Месяцы, охватывающие четыре, пять и шесть недель

Комментарии:

1. Спасибо, чувак! После стольких лет ваше решение было очень полезным для меня!)

Ответ №3:

 function getWeekOfMonth(date) {

    var nth = 0; // returning variable.
    var timestamp = date.getTime(); // get UTC timestamp of date.
    var month = date.getMonth(); // get current month.
    var m = month; // save temp value of month.

    while( m == month ) {  // check if m equals our date's month.
      nth  ; // increment our week count.
      // update m to reflect previous week (previous to last value of m).
      m = new Date(timestamp - nth * 604800000).getMonth();
    }

    return nth;

}