Минутная дата Yup/Formik не включает текущую дату
У меня есть эта схема в Yup, которая устанавливает минимальное ограничение даты в поле даты:
Yup.date()
.required(strings.RequiredField(strings.Invoice_Label_DueDate))
.min(new Date(), "Date cannot be in the past")
Но если я выберу текущую дату, она все равно вычислит ее в прошлом. Обратите внимание, что это не происходит, когда я max(new Date(), ...)
, В этом случае он включает в себя все прошлые даты вплоть до текущей даты.
Изменить: Вот пример проблемы https://codesandbox.io/s/jznz5vl7lw
3 ответа
Вы также можете использовать:
const today = new Date();
today.setHours(0, 0, 0, 0)
тогда
.min(today, 'Date cannot be in the past')
Если вы хотите установить минимум как вчерашнюю дату, вы можете объявить переменную и установить ее, например, на вчерашнюю дату (есть много других способов):
const yesterday = new Date(Date.now() -86400000);
тогда:
.min(yesterday, "Date cannot be in the past")
Я использую это для подтверждения истечения срока действия карты. Им можно манипулировать и для обычной даты.
cardExpiry: Yup.string()
.required("Card Expiry is required")
.matches(/^(0[1-9]|1[0-2])\/\d{4}$/, "Invalid Card Expiry (MM/YYYY)")
.test("cardExpiry", "Date cannot be in the past", function (value) {
const today = new Date();
const [expiryMonth, expiryYear] = value.split("/");
const cardExpiryDate = new Date(
parseInt(expiryYear),
parseInt(expiryMonth) - 1
);
return cardExpiryDate >= today;
})
Надеюсь, это кому-то поможет.