2016-09-08 1 views
0

Ich bin nicht sicher, ob dies der richtige Ort für diese Frage ist, aber ich werde trotzdem fragen.In einem JJJJMMTT-Formatdatum, in dem YY korrekt sein kann oder nicht, wie würden Sie YY ohne Hardcoding korrigieren?

Wir erhalten Daten von einer Quelle, die wir nicht kontrollieren können. Diese Daten enthalten Datumsangaben in YYyyMMDD. Die Sache ist, die Datenquelle hat einen Fehler in ihrem System, der den YY-Teil des Datums zufällig falsch macht, also müssen wir einen Workaround dafür machen.

Also dachte ich, ich werde nur die letzten sechs Ziffern des Datums heutigen

YY anhängen
substr($date_today,0,2).substr($date,-6) 

Aber die Jahre in diesen Daten nicht nur für dieses Jahr, es ist auch für die kommenden Jahre.

so sagen wir heute ist 2091-09-07 und dieses System läuft noch und dann bekommen wir ein Datum, das 2102-08-06 ist. Dann erhalten wir auch ein Datum mit einem falschen Jahr wie 2302-09-04. Wie soll ich das korrigieren? Welche Art von Codierungslösung sollte ich verwenden, um diese Fehler zu umgehen?

Ich benutze Perl BTW.

+5

Es ist nicht klar, wie das Datum falsch ist. Bitte geben Sie weitere Informationen an: Was genau möchten Sie mit dem Datum und wann machen? – choroba

Antwort

1

Wenn Sie davon ausgehen, dass die Jahre von Ihrer Datenquelle nicht mehr als 50 Jahre in der Vergangenheit oder Zukunft liegen, kann das folgende Unterprogramm verwendet werden, um das richtige Jahr für das aktuelle Jahr und die letzten beiden Ziffern des Jahres zu erraten aus der Datenquelle:

sub guess_year { 
    my ($cur_year, $yy) = @_; 

    my $cur_yy = $cur_year % 100; 
    my $YY  = $cur_year - $cur_yy; 

    if ($cur_yy < 50) { 
     # Previous century. 
     if ($yy >= $cur_yy + 50) { $YY -= 100; } 
    } 
    else { 
     # Next century. 
     if ($yy < $cur_yy - 50) { $YY += 100; } 
    } 

    return $YY + $yy; 
} 

Hier sind ein paar Testfälle:

sub test { 
    my ($cur_year, $yy) = @_; 

    my $guess = guess_year($cur_year, $yy); 
    print("cur_year: $cur_year, yy: $yy, guess: $guess\n"); 
} 

test(2016, 15); 
test(2016, 17); 
test(2016, 60); 
test(2016, 70); 
test(2080, 79); 
test(2080, 81); 
test(2080, 10); 
test(2080, 40); 

Und die Ergebnisse:

cur_year: 2016, yy: 15, guess: 2015 
cur_year: 2016, yy: 17, guess: 2017 
cur_year: 2016, yy: 60, guess: 2060 
cur_year: 2016, yy: 70, guess: 1970 
cur_year: 2080, yy: 79, guess: 2079 
cur_year: 2080, yy: 81, guess: 2081 
cur_year: 2080, yy: 10, guess: 2110 
cur_year: 2080, yy: 40, guess: 2040 
0

Der Schlüssel ist die (numerische) Differenz zwischen den JJs der beiden Daten (das heutige Datum und das eingegebene Datum). Und Sie müssen von heute YY (um +1 oder -1) immer wenn die Größe der Differenz 50 oder größer ist:

$todays_yy = substr($date_today,2,2); 
$inputs_yy = substr($date,2,2); 

$correct_YY = substr($date_today,0,2) + int(($todays_yy-$inputs_yy)/50); 

print $correct_YY . substr($date,-6); 
Verwandte Themen