Я пытаюсь проверить, чтобы дата была действительной в том смысле, что если кто-то входит в 2/30/2011
, тогда это должно быть неправильно.
Как я могу сделать это с любой датой?
Я пытаюсь проверить, чтобы дата была действительной в том смысле, что если кто-то входит в 2/30/2011
, тогда это должно быть неправильно.
Как я могу сделать это с любой датой?
Один простой способ проверить строку даты - это преобразовать ее в объект даты и проверить, например,
// Expect input as d/m/y
function isValidDate(s) {
var bits = s.split('/');
var d = new Date(bits[2], bits[1] - 1, bits[0]);
return d && (d.getMonth() + 1) == bits[1];
}
['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
console.log(s + ' : ' + isValidDate(s))
})
Будет ли первая функция isValidDate (ы), предложенная RobG, работать для ввода строки '1/2/'? Я думаю, что НЕ, потому что ГОД не подтвержден, (
Мое предложение состоит в том, чтобы использовать улучшенную версию этой функции:
//input in ISO format: yyyy-MM-dd
function DatePicker_IsValidDate(input) {
var bits = input.split('-');
var d = new Date(bits[0], bits[1] - 1, bits[2]);
return d.getFullYear() == bits[0] && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[2]);
}
Я рекомендую использовать момент .js. Только предоставление даты до момента будет подтверждать это, нет необходимости передавать dateFormat.
var date = moment("2016-10-19");
А затем date.isValid()
дает желаемый результат.
Се пост ЗДЕСЬ
Это решение не учитывает очевидные проверки даты, например, чтобы гарантировать, что детали даты являются целыми числами или части даты соответствуют очевидным проверкам проверки, например, день больше 0 и меньше 32. Это решение предполагает, что у вас уже есть все три (год, месяц, день) и что каждый из них уже проходит очевидные проверки. Учитывая эти предположения, этот метод должен работать, чтобы просто проверить, существует ли дата.
Например, 29 февраля 2009 года это не настоящая дата, а 29 февраля 2008 года. Когда вы создаете новый объект Date, например 29 февраля 2009 года, посмотрите, что произойдет (помните, что месяцы начинаются с нуля в JavaScript):
console.log(new Date(2009, 1, 29));
Вышеуказанные выходы: Sun Mar 01 2009 00:00:00 GMT-0800 (PST)
Обратите внимание, как дата просто загружается в первый день следующего месяца. Предполагая, что у вас есть другие очевидные проверки, эта информация может использоваться для определения того, действительна ли дата с помощью следующей функции (эта функция позволяет использовать ненужные месяцы для более удобного ввода):
var isActualDate = function (month, day, year) {
var tempDate = new Date(year, --month, day);
return month === tempDate.getMonth();
};
Это не полное решение и не учитывает i18n, но его можно сделать более надежным.
var isDate_ = function(input) {
var status = false;
if (!input || input.length <= 0) {
status = false;
} else {
var result = new Date(input);
if (result == 'Invalid Date') {
status = false;
} else {
status = true;
}
}
return status;
}
эта функция возвращает значение bool, является ли введенный ввод допустимой датой или нет. ex:
if(isDate_(var_date)) {
// statements if the date is valid
} else {
// statements if not valid
}
Я просто делаю римейк RobG-решения
var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
var isLeap = new Date(theYear,1,29).getDate() == 29;
if (isLeap) {
daysInMonth[1] = 29;
}
return theDay <= daysInMonth[--theMonth]
Это ES6 (с объявлением let).
function checkExistingDate(year, month, day){ // year, month and day should be numbers
// months are intended from 1 to 12
let months31 = [1,3,5,7,8,10,12]; // months with 31 days
let months30 = [4,6,9,11]; // months with 30 days
let months28 = [2]; // the only month with 28 days (29 if year isLeap)
let isLeap = ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
let valid = (months31.indexOf(month)!==-1 && day <= 31) || (months30.indexOf(month)!==-1 && day <= 30) || (months28.indexOf(month)!==-1 && day <= 28) || (months28.indexOf(month)!==-1 && day <= 29 && isLeap);
return valid; // it returns true or false
}
В этом случае я рассчитывал месяцы от 1 до 12. Если вы предпочитаете или используете модель на основе 0-11, вы можете просто изменить массивы с помощью:
let months31 = [0,2,4,6,7,9,11];
let months30 = [3,5,8,10];
let months28 = [1];
Если ваша дата имеет форму дд/мм/гггг, вы можете снять параметры функции дня, месяца и года и сделать это для их получения:
let arrayWithDayMonthYear = myDateInString.split('/');
let year = parseInt(arrayWithDayMonthYear[2]);
let month = parseInt(arrayWithDayMonthYear[1]);
let day = parseInt(arrayWithDayMonthYear[0]);
Моя функция возвращает true, если допустимая дата в противном случае возвращает false: D
function isDate (day, month, year){
if(day == 0 ){
return false;
}
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(day > 31)
return false;
return true;
case 2:
if (year % 4 == 0)
if(day > 29){
return false;
}
else{
return true;
}
if(day > 28){
return false;
}
return true;
case 4: case 6: case 9: case 11:
if(day > 30){
return false;
}
return true;
default:
return false;
}
}
console.log(isDate(30, 5, 2017));
console.log(isDate(29, 2, 2016));
console.log(isDate(29, 2, 2015));
К сожалению, кажется, что у JavaScript нет простого способа проверить строку даты по сей день. Это самый простой способ анализа дат в формате "m/d/yyyy" в современных браузерах (именно поэтому он не указывает основание для parseInt, так как оно должно быть 10, начиная с ES5):
const dateValidationRegex = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
function isValidDate(strDate) {
if (!dateValidationRegex.test(strDate)) return false;
const [m, d, y] = strDate.split('/').map(n => parseInt(n));
return m === new Date(y, m - 1, d).getMonth() + 1;
}
['10/30/2000abc', '10/30/2000', '1/1/1900', '02/30/2000', '1/1/1/4'].forEach(d => {
console.log(d, isValidDate(d));
});
Привет! Пожалуйста, найдите ответ ниже. Это делается путем проверки даты создания вновь
var year=2019;
var month=2;
var date=31;
var d = new Date(year, month - 1, date);
if (d.getFullYear() != year
|| d.getMonth() != (month - 1)
|| d.getDate() != date) {
alert("invalid date");
return false;
}
function isValidDate(year, month, day) {
var d = new Date(year, month - 1, day, 0, 0, 0, 0);
return (!isNaN(d) && (d.getDate() == day && d.getMonth() + 1 == month && d.getYear() == year));
}
Хотя это было поднято давно, все еще очень желаемое подтверждение. Я нашел интересный блог с несколькими функциями.
/* Please use these function to check the reuslt only. do not check for otherewise. other than utiljs_isInvalidDate
Ex:-
utiljs_isFutureDate() retuns only true for future dates. false does not mean it is not future date. it may be an invalid date.
practice :
call utiljs_isInvalidDate first and then use the returned date for utiljs_isFutureDate()
var d = {};
if(!utiljs_isInvalidDate('32/02/2012', d))
if(utiljs_isFutureDate(d))
//date is a future date
else
// date is not a future date
*/
function utiljs_isInvalidDate(dateStr, returnDate) {
/*dateStr | format should be dd/mm/yyyy, Ex:- 31/10/2017
*returnDate will be in {date:js date object}.
*Ex:- if you only need to check whether the date is invalid,
* utiljs_isInvalidDate('03/03/2017')
*Ex:- if need the date, if the date is valid,
* var dt = {};
* if(!utiljs_isInvalidDate('03/03/2017', dt)){
* //you can use dt.date
* }
*/
if (!dateStr)
return true;
if (!dateStr.substring || !dateStr.length || dateStr.length != 10)
return true;
var day = parseInt(dateStr.substring(0, 2), 10);
var month = parseInt(dateStr.substring(3, 5), 10);
var year = parseInt(dateStr.substring(6), 10);
var fullString = dateStr.substring(0, 2) + dateStr.substring(3, 5) + dateStr.substring(6);
if (null == fullString.match(/^\d+$/)) //to check for whether there are only numbers
return true;
var dt = new Date(month + "/" + day + "/" + year);
if (dt == 'Invalid Date' || isNaN(dt)) { //if the date string is not valid, new Date will create this string instead
return true;
}
if (dt.getFullYear() != year || dt.getMonth() + 1 != month || dt.getDate() != day) //to avoid 31/02/2018 like dates
return true;
if (returnDate)
returnDate.date = dt;
return false;
}
function utiljs_isFutureDate(dateStrOrObject, returnDate) {
return utiljs_isFuturePast(dateStrOrObject, returnDate, true);
}
function utiljs_isPastDate(dateStrOrObject, returnDate) {
return utiljs_isFuturePast(dateStrOrObject, returnDate, false);
}
function utiljs_isValidDateObjectOrDateString(dateStrOrObject, returnDate) { //this is an internal function
var dt = {};
if (!dateStrOrObject)
return false;
if (typeof dateStrOrObject.getMonth === 'function')
dt.date = new Date(dateStrOrObject); //to avoid modifying original date
else if (utiljs_isInvalidDate(dateStrOrObject, dt))
return false;
if (returnDate)
returnDate.date = dt.date;
return true;
}
function utiljs_isFuturePast(dateStrOrObject, returnDate, isFuture) { //this is an internal function, please use isFutureDate or isPastDate function
if (!dateStrOrObject)
return false;
var dt = {};
if (!utiljs_isValidDateObjectOrDateString(dateStrOrObject, dt))
return false;
today = new Date();
today.setHours(0, 0, 0, 0);
if (dt.date)
dt.date.setHours(0, 0, 0, 0);
if (returnDate)
returnDate.date = dt.date;
//creating new date using only current d/m/y. as td.date is created with string. otherwise same day selection will not be validated.
if (isFuture && dt.date && dt.date.getTime && dt.date.getTime() > today.getTime()) {
return true;
}
if (!isFuture && dt.date && dt.date.getTime && dt.date.getTime() < today.getTime()) {
return true;
}
return false;
}
function utiljs_isLeapYear(dateStrOrObject, returnDate) {
var dt = {};
if (!dateStrOrObject)
return false;
if (utiljs_isValidDateObjectOrDateString(dateStrOrObject, dt)) {
if (returnDate)
returnDate.date = dt.date;
return dt.date.getFullYear() % 4 == 0;
}
return false;
}
function utiljs_firstDateLaterThanSecond(firstDate, secondDate, returnFirstDate, returnSecondDate) {
if (!firstDate || !secondDate)
return false;
var dt1 = {},
dt2 = {};
if (!utiljs_isValidDateObjectOrDateString(firstDate, dt1) || !utiljs_isValidDateObjectOrDateString(secondDate, dt2))
return false;
if (returnFirstDate)
returnFirstDate.date = dt1.date;
if (returnSecondDate)
returnSecondDate.date = dt2.date;
dt1.date.setHours(0, 0, 0, 0);
dt2.date.setHours(0, 0, 0, 0);
if (dt1.date.getTime && dt2.date.getTime && dt1.date.getTime() > dt2.date.getTime())
return true;
return false;
}
function utiljs_isEqual(firstDate, secondDate, returnFirstDate, returnSecondDate) {
if (!firstDate || !secondDate)
return false;
var dt1 = {},
dt2 = {};
if (!utiljs_isValidDateObjectOrDateString(firstDate, dt1) || !utiljs_isValidDateObjectOrDateString(secondDate, dt2))
return false;
if (returnFirstDate)
returnFirstDate.date = dt1.date;
if (returnSecondDate)
returnSecondDate.date = dt2.date;
dt1.date.setHours(0, 0, 0, 0);
dt2.date.setHours(0, 0, 0, 0);
if (dt1.date.getTime && dt2.date.getTime && dt1.date.getTime() == dt2.date.getTime())
return true;
return false;
}
function utiljs_firstDateEarlierThanSecond(firstDate, secondDate, returnFirstDate, returnSecondDate) {
if (!firstDate || !secondDate)
return false;
var dt1 = {},
dt2 = {};
if (!utiljs_isValidDateObjectOrDateString(firstDate, dt1) || !utiljs_isValidDateObjectOrDateString(secondDate, dt2))
return false;
if (returnFirstDate)
returnFirstDate.date = dt1.date;
if (returnSecondDate)
returnSecondDate.date = dt2.date;
dt1.date.setHours(0, 0, 0, 0);
dt2.date.setHours(0, 0, 0, 0);
if (dt1.date.getTime && dt2.date.getTime && dt1.date.getTime() < dt2.date.getTime())
return true;
return false;
}
скопируйте весь код в файл и включите.
надеюсь это поможет.