web-dev-qa-db-de.com

Wie validiere ich ein Datum?

Ich versuche zu testen, ob ein Datum gültig ist in dem Sinne, dass jemand falsch eingegeben wird, wenn er 2/30/2011 eingibt.

Wie kann ich das mit einem beliebigen Datum machen?

62
Seth Duncan

Eine einfache Möglichkeit zum Überprüfen einer Datumszeichenfolge besteht darin, in ein Datumsobjekt zu konvertieren und dieses zu testen, z.

// 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))
})

Wenn Sie ein Datum auf diese Weise testen, muss nur der Monat getestet werden. Wenn das Datum außerhalb des gültigen Bereichs liegt, ändert sich der Monat. Gleich, wenn der Monat außerhalb des gültigen Bereichs liegt. Jedes Jahr ist gültig.

Sie können auch die Bits der Datumszeichenfolge testen:

function isValidDate2(s) {
  var bits = s.split('/');
  var y = bits[2],
    m = bits[1],
    d = bits[0];
  // Assume not leap year by default (note zero index for Jan)
  var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  // If evenly divisible by 4 and not evenly divisible by 100,
  // or is evenly divisible by 400, then a leap year
  if ((!(y % 4) && y % 100) || !(y % 400)) {
    daysInMonth[1] = 29;
  }
  return !(/\D/.test(String(d))) && d > 0 && d <= daysInMonth[--m]
}

['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
  console.log(s + ' : ' + isValidDate2(s))
})

117
RobG

Funktioniert die erste Funktion isValidDate (s), die von RobG vorgeschlagen wird, für den Eingabestring '1/2 /' ?

Mein Vorschlag ist, eine verbesserte Version dieser Funktion zu verwenden:

//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]);
}
10
Piotr Kwiatek

Ich empfehle die Verwendung von moment.js. Nur die Angabe des Datums für den Moment wird es validieren, und es muss kein dateFormat übergeben werden.

var date = moment("2016-10-19");

Und dann gibt date.isValid() das gewünschte Ergebnis.

Se post HIER

5

Bei dieser Lösung werden offensichtliche Datumsüberprüfungen nicht berücksichtigt, z. B. stellen Sie sicher, dass Datumsteile ganze Zahlen sind oder dass Datumsteile offensichtlichen Validierungsprüfungen entsprechen, z. B. der Tag größer als 0 und kleiner als 32 ist. Jahr, Monat, Tag) und dass beide bereits offensichtliche Validierungen bestehen. Unter diesen Voraussetzungen sollte diese Methode funktionieren, um einfach zu prüfen, ob das Datum existiert.

Zum Beispiel ist der 29. Februar 2009 kein reales Datum, aber der 29. Februar 2008 ist. Wenn Sie ein neues Date-Objekt wie den 29. Februar 2009 erstellen, schauen Sie, was passiert (Denken Sie daran, dass die Monate in JavaScript bei null beginnen):

console.log(new Date(2009, 1, 29));

Die obigen Zeilenausgaben: So Mar 01 2009 00:00:00 GMT-0800 (PST)

Beachten Sie, wie das Datum einfach auf den ersten Tag des nächsten Monats übertragen wird. Angenommen, Sie haben andere offensichtliche Validierungen vorhanden. Diese Informationen können verwendet werden, um zu bestimmen, ob ein Datum mit der folgenden Funktion echt ist (Diese Funktion ermöglicht Monate, die nicht null sind, um eine bequemere Eingabe zu ermöglichen):

var isActualDate = function (month, day, year) {
    var tempDate = new Date(year, --month, day);
    return month === tempDate.getMonth();
};

Dies ist keine vollständige Lösung und berücksichtigt nicht i18n, es könnte jedoch robuster gemacht werden.

4
Luke Cordingley
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;
      }

diese Funktion gibt einen bool-Wert zurück, ob die angegebene Eingabe ein gültiges Datum ist oder nicht. Ex: 

if(isDate_(var_date)) {
  // statements if the date is valid
} else {
  // statements if not valid
}
4
Dhayalan

Ich mache gerade ein Remake von RobG-Lösung

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]
1
Javier

Dies ist JS6 (mit let-Deklaration). 

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
}

In diesem Fall habe ich Monate von 1 bis 12 vorgesehen. Wenn Sie das 0-11-basierte Modell bevorzugen oder verwenden, können Sie die Arrays einfach ändern mit:

let months31 = [0,2,4,6,7,9,11];
let months30 = [3,5,8,10];
let months28 = [1];

Wenn Ihr Datum im Format TT/MM/JJJJ ist, können Sie die Funktionsparameter Tag, Monat und Jahr abbrechen und diese abrufen:

let arrayWithDayMonthYear = myDateInString.split('/');
let year = parseInt(arrayWithDayMonthYear[2]);
let month  = parseInt(arrayWithDayMonthYear[1]);
let day = parseInt(arrayWithDayMonthYear[0]);
0
forget_me_alice

Es ist bedauerlich, dass es so aussieht, als ob JavaScript bis heute keine einfache Möglichkeit hat, eine Datumszeichenfolge zu überprüfen. Dies ist der einfachste Weg, an den ich denken kann, um Datumsangaben in modernen Browsern im Format "m/d/jjjj" zu parsen (deshalb wird die Basis nicht für parseInt angegeben, da es seit ES5 10 sein sollte):

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));
});

0
rosenfeld

Meine Funktion gibt true zurück, wenn ein gültiges Datum ist, andernfalls 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));

0
Alejandro Reyes

Hi Bitte finden Sie die Antwort unten. Dies wird durch Überprüfen des neu erstellten Datums durchgeführt

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;
}