Урок по использованию метода getMonth() с нулевым значением


Урок по использованию метода 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'
Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

Я хотел поделиться этой информацией со всеми вами, чтобы помочь кому-то еще избежать столкновения с этой ошибкой в будущем. Каждый раз, когда я работаю с датами, я сталкиваюсь с теми или иными проблемами, и этот случай стал еще одним уроком для меня в работе с датами.

Оцените статью
devanswers.ru
Добавить комментарий