Урок по использованию метода getMonth() прототипа Date
Вчера у меня был проект, в котором я добавлял небольшую функцию на внутренний сайт, чтобы предупредить пользователя, если у него возникла проблема с датой при заполнении веб-формы для текущей даты. Эта функция сравнивала дату/время локального компьютера с датой/временем элемента ввода типа HTML Date, введенного пользователем. Если введенная дата была не сегодняшней, то выдавалось предупреждение о вводе данных для неправильной даты. Это должно было решить проблему, связанную с вводом пользователями неправильных данных.
Мой подход к этому заключался в быстром сравнении новой переменной Date со значением, введенным пользователем, и последующем выдаче пользователю предупреждения alert()
в случае несоответствия.
let myDate = new Date()
console.log(myDate)
// Thu Aug 10 2022 12:39:27 GMT-0700 (Pacific Daylight Time)
Отлично, у нас есть переменная, которая извлекает правильную дату/время.
Элементы HTML хранят дату в формате ГГГГ/ММ/ДД, а getDate извлекает дату в порядке ММ/ДД/ГГГГ, поэтому их нельзя сравнивать напрямую.
Мой подход заключался в том, чтобы изменить строку даты так, чтобы она быстро совпадала с датой пользователей. Есть несколько способов сделать это, но я использовал именно этот.
let myDate = new Date();
let newDate = []
newDate.push(myDate.getFullYear(), '-', myDate.getMonth(), '-', myDate.getDay())
// -> [2022,-,7,-,3]
console.log('newDate.join()' + newDate.join(''))
// -> 2022-7-3
Вы видите ошибки? Их две: первая — месяц, вторая — день. В спешке при создании этой быстрой функции я использовал getDay() вместо getDate(), что дало мне неправильную календарную дату.
Я не заметил ошибки и был весьма озадачен тем, что getMonth() извлекала данные из предыдущего месяца, но когда я предпринял другие попытки извлечь дату, она извлекала 8-й месяц. Поэтому я обратился к Twitter и спросил у сообщества.
![]()
Крис Бенджамин@_chrisbenjamin
Я так запутался… Я, должно быть, делаю что-то не так. Как ‘let myDate = new Date()’ показывает правильную дату и время, но когда я извлекаю информацию с помощью getMonth(), getDay() и getFullYear(), он вытаскивает 7/3/2022?15:56 PM — 10 Aug 2022![]()
![]()
![]()
Несколько отзывчивых людей быстро ответили, что до этого момента я и не подозревал, что getMonth() вытаскивает месяцы с нулевым значением за все эти годы работы с датами. Несколько человек направили меня к MDN getMonth, который четко объясняет, что происходит.
Другая ошибка связана с getMonth(). Эта функция извлекает месяц из даты в нулевом значении. Это означает, что для календарного года месяцы нумеруются 0-11, в то время как август — это 7, а не 8.
Метод getMonth() возвращает месяц в указанной дате по местному времени, как значение, основанное на нуле (где ноль указывает на первый месяц года). — MDN
В большинстве случаев при извлечении дат я использую myDate.toLocaleString()
или myDate.toLocaleDateString()
, которые маскируют вывод и показывают правильный месяц из-за локали.
myDate.toLocaleString()
// -> '8/11/2022, 12:54:53 PM'
myDate.toLocaleDateString()
// -> '8/11/2022'
Заключение
Я хотел поделиться этой информацией со всеми вами, чтобы помочь кому-то еще избежать столкновения с этой ошибкой в будущем. Каждый раз, когда я работаю с датами, я сталкиваюсь с теми или иными проблемами, и этот случай стал еще одним уроком для меня в работе с датами.