Raketenwilli: Datum-String ('Y-m-d') auf Gültigkeit testen.

Beitrag lesen

Naja. Wenn man das will, dann muss man wohl das Datum selbst zerlegen und prüfen oder aber etwas wie Moment.js verwenden. Das kann angeblich solche „ungültigen“ Angaben erkennen.

Wenn Du das selbst machen willst, dann sei Dir folgender Ansatz empfohlen:

Du prüfst, ob sich der String zerlegen lässt, ob da auch 3 Elemente herauskommen - wenn nicht ist das Datum ungültig

Dann checkst Du,

  • ob der Monat 31 Tage hat und der Tag kleiner als 32 ist, sodann
  • ob der Monat 30 Tage hat und der Tag kleiner als 31 ist, sodann
  • ob es der Februar ist und der Tag kleiner als 29 ist.
  • wenn der Monat der Februar ist, ob es denn ein Schaltjahr ist und der Tag kleiner als 30 ist.

Ausgaben:

  • In den zutreffenden/positiven Fällen habe ich mit entschlossen, das überprüfte Array zurückzuliefern.
  • Wenn nichts davon zutrifft ist es kein gültiges Datum, die Funktion liefert false

Achso:

Ein paar Tests mit gültigen und ungültigen Angaben habe ich eingebaut. Es wird sich vorhersehbar Kritik daran entzünden, dass mein Vorgehen wie auch die Notation antiquiert, gar altmodisch sei. Naja: Ich kann das eben noch…

function dateCheckerYmd( input ) {

	var ar=input.split(/[^0-9]/);

	if ( 3 !=  ar.length ) {
		return false;
	}

	var y = parseInt( ar[0] );
	var m = parseInt( ar[1] );
	var d = parseInt( ar[2] );
   
	var m31 = new Array( 1, 3, 5, 7, 8, 10, 12 );
	var m30 = new Array( 4, 6, 9, 11 );

	if ( m31.indexOf( m ) != -1 ) {
		if ( ( d > 0 )  && ( d < 32 ) ) {
			return new Array( y, m, d );
		}
	}
	if ( m30.indexOf( m ) != -1 ) {
		if ( ( d > 0 )  && ( d < 31 ) ) {
			return new Array( y, m, d );
		}
	} 

	if ( m == 2 && d > 0 && d < 29 ) {
		return new Array( y, m, d );
	}

	var Feb29 = false;
	if ( 
				Number.isInteger( y/4 )
			&& ( 
						false == Number.isInteger( y/100 )
					||  true  == Number.isInteger( y/400 )
				)
	) {
		Feb29 = true;	
	}

	if ( ( Feb29 == true ) && ( d > 0 )  && ( d < 30 ) ) {
		return new Array( y, m, d );
	} 
	if ( Feb29 == false  && ( d > 0 )  && ( d < 29 ) ) {
		return new Array( y, m, d );
	}
	return false;
}

function teste( s ) {
	console.log( s + ': ' + dateCheckerYmd( s ) );
}

tests = new Array (
	'2000-02-29',
	'2001-02-29',
	'2020-02-29',
	'2100-02-29',
	'2000-13-01',
	'2000-12-31',
	'2000 12 31',
	'2000-12-32',
	'2000-12',
	'2000-12-01-1'
);

tests.forEach ( teste );


Ausgaben:

2000-02-29: 2000,2,29
2001-02-29: false
2020-02-29: 2020,2,29
2100-02-29: false
2000-13-01: 2000,13,1
2000-12-31: 2000,12,31
2000 12 31: 2000,12,31
2000-12-32: false
2000-12: false
2000-12-01-1: false