У меня есть элемент управления JavaScript, состоящий из 3 раскрывающихся списков для сбора даты рождения от пользователей (не спрашивайте меня, почему мы не используем средство выбора даты) Выпадающий список для дня, месяца и года. Когда во всех 3 выпадающих списках выбрано значение, я собираю значения и создаю дату:
var d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, this.selectedDay));
Я не уверен, почему вам нужно вычесть 1 из месяца, я просто скопировал этот бит из существующей кодовой базыи это похоже на работу. Я думаю, месяцы имеют нулевой индекс по любой причине.
Очевидная проблема с этими выпадающими списками состоит в том, что пользователь может выбрать недопустимую дату. Ничто не мешает им выбрать 31 день и затем выбрать февраль. Это приведет к смещению даты на несколько дней, то есть значения 1999, 2, 31 дадут мне 3 марта 1999 года. Итак, у меня есть проверка:
if (d.getDate() != this.selectedDay) {
d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, 0));
this.selectedDay = d.getDate();
Еслидень месяца отличается от моего первоначального значения, это означает, что дата сместилась, поэтому я изменяю дату на последний день прошлого месяца (следовательно, 0 для дня), а затем я обновляю значение в раскрывающемся списке «дней».
Странно то, что я не могу этого сделать.selectedMonth - 1 в этом втором преобразовании. Это вернет меня обратно к 31 января. Поэтому я должен сделать следующее:
var d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, this.selectedDay));
if (d.getDate() != this.selectedDay) {
d = new Date(Date.UTC(this.selectedYear, this.selectedMonth, 0));
this.selectedDay = d.getDate();
}
Это работает, но это просто ошеломляет меня. Почему месяцы ведут себя по-разному, если я использую 0 в качестве значения для дней вместо действительного дня месяца? Зачем кому-то реализовывать это так? У кого-нибудь есть логическое объяснение?