#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. Спасибо, чувак! После стольких лет ваше решение было очень полезным для меня!)
Ответ №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;
}