Raketenwilli: Nachgemessen

Beitrag lesen

Zu aufwendig? Man messe wie folgt:

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 );
	if ( m31.indexOf( m ) != -1 ) {
		if ( ( d > 0 )  && ( d < 32 ) ) {
			return new Array( y, m, d );
		}
	}
	
	var m30 = new Array( 4, 6, 9, 11 );
	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;
}

output='';
function teste( s ) {
	 output = output + s + ': ' + dateCheckerYmd( s ) + "\n";
}

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'
);
const { performance } = require('perf_hooks');

t = performance.now();
tests.forEach ( teste );
console.log( t = performance.now() - t + ' Millisekunden' );
console.log( output );

vers.

function dateCheckerYmd( input ) {

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

	if ( 3 !=  ar.length ) {
		return false;
	}
	
    dto = new Date( input );
    
    var d = parseInt( ar[2] );
    if ( dto.getDate()     != d ) { return false; }
    
    var m = parseInt( ar[1] ) - 1;
    if ( dto.getMonth()    != m ) { return false; }
	
    var y = parseInt( ar[0] );	
    if ( dto.getFullYear() != y ) { return false; }

    return dto;
}

output='';
function teste( s ) {
	 output = output + s + ': ' + dateCheckerYmd( s ) + "\n";
}

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'
);
const { performance } = require('perf_hooks');
t = performance.now();
tests.forEach ( teste );
console.log( t = performance.now() - t + ' Millisekunden' );
console.log( output );


Dann kann man die aber gleich als Datum interpretieren und prüfen, ob der Tag des so ermittelten Datums mit der entsprechenden Zahl im String übereinstimmt. Das sollte genügen.

Mit der Messmethode ist das Skript gemäß Deiner Vorgehensweise auf dem Raspi400 (mit nodejs v12.22.9) um den Faktor 1,7 langsamer als meine „zu Fuß-Methode“:

1.051170002669096 Millisekunden

vers.

1.861379001289606 Millisekunden

(Macht man die Ausgaben einzeln erhöht sich die Zeit auf unverschämte 15 Millisekunden - das das Öffnen und schließen des Ausgabekanals „teuer“ ist habe ich - glaub ich - mal von Dir gelernt.)