Antwort an „Raketenwilli“ verfassen

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.)

freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen