Показать предупреждение, если выбранная дата недоступна

У меня есть ввод даты:

<input id = "datetime" type = "date" step = "1">
<p id = "status"></p>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script>

Я хочу, чтобы в сообщении отображалось «Недопустимая дата», если выбранная дата существует в массиве RestrictedDate. Прямо сейчас я застрял на (< '14/10/2022')

var datetimeElement = document.getElementById("datetime");
var statusElement = document.getElementById("status");
var RestrictedDate = ["20/10/2022", "21/10/2022", "22/10/2022", "23/10/2022", "24/10/2022"];

// A simple function to check the validity of a date using the isValid() method
function checkValidity() 
{
 if (moment(datetimeElement.value.toString()).isValid()) 
 {
     // Datetime exist in RestrictedDate     
     if (moment(datetimeElement.value.toString()).format('DD/MM/YYYY') < '14/10/2022') //NEED HELP HERE
     {
     // Invalid date
     statusElement.innerHTML = 'Invalid date';
     } else {
     // Datetime is valid
     statusElement.innerHTML = 'Valid date';
     }
  } else {
// Datetime is invalid
statusElement.innerHTML = 'Please select date.';
}
}

// Check date validity every 1 seconds and update the text
setInterval(function() {
checkValidity();
}, 1000);

Код можно посмотреть Здесь

Все, что опубликовано до сих пор, — это код JavaScript. Это на самом деле вопрос С#? Планируете ли вы использовать C# для решения этой проблемы, или ваше приложение просто использует C#?

gunr2171 13.10.2022 17:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать includes метод Array прототипа.

function checkValidity() {
  if (moment(datetimeElement.value.toString()).isValid()) {
    const formatedDate = moment(datetimeElement.value.toString()).format('DD/MM/YYYY');
    if (RestrictedDate.includes(formatedDate)) {
      // Invalid date
      statusElement.innerHTML = 'Invalid date';
    } else {
      // Datetime is valid
      statusElement.innerHTML = 'Valid date';
    }
  } else {
    // Datetime is invalid
    statusElement.innerHTML = 'Please select date.';
  }
}

Почему вы храните ограниченные даты в виде строк. Почему бы не хранить ограниченные даты как фактические объекты Date, тогда в вашей проверке fn вы можете сделать что-то вроде:

const isRestricted = RestrictedDate.find(x => x.getTime() === new Date(dateTimeElement.value).getTime());

Кроме того, если возможно, я бы использовал что-то вроде date-fns вместе с собственными объектами даты, а не Moment.js, который медленный, сложный в отладке и теперь является устаревшим проектом.

Остерегайтесь getTime(), указывающего время в миллисекундах. У вас будут проблемы из-за местных жителей: dateTimeElement дает дату ISO8601 «2022-10-13». И новая дата ("2022-10-13") даст вам метку времени в миллисекундах, которая зависит от смещения времени локали. Таким образом, вы не можете хранить элементы Date для сравнения. Например. вы храните 10.13.2022 00:00 != 10.13.2022 02:00 (локальная дата от французского посетителя). Наконец, «хранить» элементы даты js непросто, поскольку они не сериализуются через JSON (вы бы преобразовывали их туда и обратно из строк). Итак, использование строк — это, наконец, правильный способ сделать это.

Pierre 13.10.2022 17:49

В качестве общего совета вы, вероятно, извлекли бы новую инвариантную часть Date(...)... из кода и сохранили бы ее в константе, чтобы избежать ее создания при каждом выполнении функции предиката.

Pierre 13.10.2022 17:50
Ответ принят как подходящий

Вы можете просто проверить, присутствует ли значение даты в массиве, и это должно помочь без moment.js

var datetimeElement = document.getElementById("datetime");
var statusElement = document.getElementById("status");
var RestrictedDate = ["20/10/2022", "21/10/2022", "22/10/2022", "23/10/2022", "24/10/2022"];

function getFormattedDate(date) {
    // this function is pulled from this answer at https://stackoverflow.com/a/15764763/11307127
    let year = date.getFullYear();
    let month = (1 + date.getMonth()).toString().padStart(2, '0');
    let day = date.getDate().toString().padStart(2, '0');
  
    return day + '/' + month + '/' + year;
}

datetimeElement.addEventListener('change', function() {
const date = getFormattedDate(new Date(this.value));
if (RestrictedDate.includes(date))
{
statusElement.innerText = "Invalid Date";
}
else
{
statusElement.innerText = "Valid Date";
}
})
<input id = "datetime" type = "date" step = "1">
<p id = "status">Please select a date</p>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script>

Другие вопросы по теме