Testen statt behaupten
bearbeitet von Raketenwilli> Naja. Wenn man das will, dann muss man wohl das Datum selbst zerlegen und prüfen oder aber etwas wie [Moment.js](https://momentjs.com/docs/) verwenden. [**Das kann angeblich solche „ungültigen“ Angaben erkennen**](https://momentjs.com/docs/#/parsing/is-valid/).
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…
~~~js
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
~~~
Testen statt behaupten
bearbeitet von Raketenwilli> Naja. Wenn man das will, dann muss man wohl das Datum selbst zerlegen und prüfen oder aber etwas wie [Moment.js](https://momentjs.com/docs/) verwenden. [**Das kann angeblich solche „ungültigen“ Angaben erkennen**](https://momentjs.com/docs/#/parsing/is-valid/).
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…
~~~js
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: true
2001-02-29: false
2020-02-29: true
2100-02-29: false
2000-13-01: true
2000-12-31: true
2000 12 31: true
2000-12-32: false
2000-12: false
2000-12-01-1: false
~~~
Testen statt behaupten
bearbeitet von Raketenwilli> Naja. Wenn man das will, dann muss man wohl das Datum selbst zerlegen und prüfen oder aber etwas wie [Moment.js](https://momentjs.com/docs/) verwenden. [**Das kann angeblich solche „ungültigen“ Angaben erkennen**](https://momentjs.com/docs/#/parsing/is-valid/).
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, dann checkst Du, ob das Jahr ein Schaltjahr ist.
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…
~~~js
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: true
2001-02-29: false
2020-02-29: true
2100-02-29: false
2000-13-01: true
2000-12-31: true
2000 12 31: true
2000-12-32: false
2000-12: false
2000-12-01-1: false
~~~