#javascript #алгоритм
Как определить общее количество (неполные + полные) недель в произвольном месяце? Исходим из того что неделя начинается с понедельника и заканчивается воскресеньем. Другими словами, сколько строк календаря занимает тот или иной месяц. Ноя.2015 - 6 недель (01.11 - Вс, 30.11 - Пн) Дек.2015 - 5 недель (01.12 - Вт, 31.12 - Чт)
Ответы
Ответ 1
На основании дня недели последнего числа месяца находим число дней прошедших до последнего понедельника. Делим это число на 7 и округляем вверх, получаем кол-во недель прошедших до последней недели, прибавляем 1. function getWeeks(year, month) // Внимание: Месяцы нумеруются с 0, как принято в JS { var l=new Date(year, month+1, 0); return Math.ceil( (l.getDate()- (l.getDay()?l.getDay():7))/7 )+1; }Ответ 2
Для российской недели (пн-вс): function weeks_in_month(year, month) { var weeks = 1; var day = -1; for (var i = 1; i <= days_in_month; i++) { var newday = new Date(year, month, i).getDay(); if (day == 0 && newday == 1) { weeks += 1; } day = newday; } return weeks; } for (var i=0; i<12; i++) { console.log(weeks_in_month(2015, i)); } Вывод в консоль: Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 6 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 6 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 5 Gjs-Message: JS LOG: 6 Gjs-Message: JS LOG: 5 Корректный алгоритм без перебора всех дней месяца: function first_monday_in_month(year, month, monday) { var day = new Date(year, month, 1); while (day.getDay() != monday) { day.setDate(day.getDate() + 1); } return day; } function weeks_in_month(year, month, week_start_day) { var monday = first_monday_in_month(year, month, week_start_day); var weeks = monday.getTime() == (new Date(year, month, 1)).getTime() ? 0 : 1; while (monday.getMonth() == month) { monday.setDate(monday.getDate() + 7); weeks++; } return weeks; }
Комментариев нет:
Отправить комментарий