Я пытаюсь создать календарь, и я попробовал ниже.
function displayCalendar() {
var dateNow = new Date();
var month = dateNow.getMonth();
var counter = 1;
var nextMonth = month + 1;
var prevMonth = month -1;
var day = dateNow.getDate();
var year = dateNow.getFullYear();
var dayPerMonth = ["31","28","31","30","31","30","31","31","30","31","30","31"]
// days in previous month and next one , and day of week.
var nextDate = new Date(nextMonth +' 1 ,'+year);
var weekdays = nextDate.getDay();
var numOfDays = dayPerMonth[month];
var ul = document.getElementById('dates');
var monthInt = month + 1;
var currentMonth = document.getElementById('currentMonth');
monthInt.toString().length === 1 ? currentMonth.innerHTML = "0" + monthInt : currentMonth.innerHTML = monthInt;
// add empty li
while (weekdays > 0) {
var li = document.createElement('li');
ul.appendChild(li);
weekdays--;
}
while (counter <= numOfDays) {
var li = document.createElement('li');
li.innerHTML = counter;
ul.appendChild(li);
counter++;
}
}
Он отлично работает, но когда я меняю месяц на август, как этот var month = dateNow.getMonth() + 1;
первая дата начинается в воскресенье. Он должен начаться в среду.
Я думаю, что этот код не работает
while (weekdays > 0) {
var li = document.createElement('li');
ul.appendChild(li);
weekdays--;
}
В хроме это работает и начинается в среду правильно. Кто-нибудь знает, почему он не работает? Заранее спасибо!
Я думаю, проблема заключается в том, что при вычислении nextMonth для ввода вашей строки вы принимаете месяцы в датах в js, начиная с 1. Но они начинаются с 0. Таким образом, ваша дата теперь получает месяц, давая вам 6, а не 7, и когда вы добавляете 1 вы получаете 7, а не 8. Добавьте 2, и вы получите среду, как хотите. В частности, вам нужно var nextMonth = month + 2;
Я тестировал это в Firefox. Я согласен с другим опубликованным ответом о том, что я не люблю формат даты. Кроме того, вы не используете prevMonth. Вы должны удалить его. Или, если вам это нужно, у него не должно быть -1. Наконец, вы захотите вернуться к своему индексу в массив daysPerMonth. Если вы хотите количество дней в следующем месяце, оно отключено.
Я думаю, что проблема заключается в вашем формате даты. Chrome является более щедрым в разборе даты, которую вы даете ему, которая представляет собой строку, которая выглядит как "7 1,2018"
. Chrome принимает это как действительную дату, Safari этого не делает. Если вы убедитесь, что вы поместили сокращения между месяцем, датой и годом, например "7/1/2018"
это будет работать лучше.
Как сказал kshetline, проблема была в формате даты. Изменен этот код
var nextDate = new Date(nextMonth +' 1 ,'+year); var weekdays = nextDate.getDay();
в
var nextDate = new Date(year, month, 1);
var weekdays = nextDate.getDay();
тогда это сработало отлично!