2016-07-05 6 views
1

der folgenden Code läuft auf einem Windows 7-System vor:Datum Validierung mit dem Takt Befehl

% info patchlevel 
8.6.4 
% clock scan "1995-01-35" -format "%Y-%m-%d" 
791856000 
% clock format [clock scan "1995-01-35" -format "%Y-%m-%d"] -format "%Y-%m-%d" 
1995-02-04 
% 

ich in diese Situation lief, als ob eine Zeichenfolge ein gültiges Datum war, um zu bestimmen versuchte, erwarte ich den ersten Takt scannen um fehlzuschlagen, da 35 kein gültiger Tag ist, aber was passiert, ist, dass ich ein Datum 35 Tage nach dem 1. Januar bekomme.

In meinem Code vergleiche ich jetzt die Ausgabe des 2. Uhr-Befehls mit dem ursprünglichen Eingang und entscheide, dass die Zeichenfolge nicht wirklich ein gültiges Datum ist, wenn das Ergebnis anders ist.

Gibt es eine bessere Möglichkeit, ein Datum zu validieren und ist dies das erwartete Verhalten des Uhrbefehls, kann ich es nicht finden beschrieben in der Handbuchseite für die Uhr?

Antwort

3

Es ist keine eingebaute Funktionalität in . Wenn die Daten/Monate überschritten werden, wird es zu den aufeinanderfolgenden Tagen/Monaten hinzugefügt.

In Ihrem Fall geben Sie 35. des Monats Januar. Die zusätzlichen 4 Tage (d. H. 31 + 4 = 35) werden addiert und als Monat, der vierte Tag, berechnet.

Im bizarren Fall, dass die angegebene Anzahl von Tagen Zugabe ein Datum ergibt , das nicht existiert, weil es innerhalb der fiel Tage nach dem fällt Julian-to-Gregorian Umwandlung wird das Datum konvertiert, als ob es auf der Julianische Kalender.

Hinzufügen einer Anzahl von Monaten oder einer Anzahl von Jahren ist ähnlich; wandelt die angegebene Zeit in ein Kalenderdatum und eine Uhrzeit um. Es fügt dann die erforderliche Anzahl von Monaten oder Jahren hinzu und wandelt das resultierende Datum und die Uhrzeit in eine absolute Zeit um.

Wenn das resultierende Datum nicht möglich ist, weil der Monat zu wenige Tage hat (zum Beispiel wenn 1 Monat bis 31. Januar hinzugefügt wird), wird der letzte Tag des Monats ersetzt. Wenn also ein Monat bis zum 31. Januar hinzugefügt wird, ergibt das am 28. Februar in einem gemeinsamen Jahr oder am 29. Februar in einem Schaltjahr .

proc is_valid_date {date {date_format "%Y-%m-%d"}} { 
    return [string equal [clock format [clock scan $date -format $date_format] -format $date_format] $date] 
} 

Das Datumsformat ist optional und standardmäßig auf %Y-%m-%d. Wenn das Format nicht übereinstimmt, schlägt es fehl. Sie können die Ausnahmen behandeln.

Ausgang:

% is_valid_date "1995-02-28" 
1 
% is_valid_date "1995-01-35" 
0 
% 

Wir sind das Datum auf eine lange Umwandlung und wieder zu dem Zeitpunkt zurückkehrt. Wenn beide nicht gleich sind, ist die angegebene Eingabe falsch.

Referenz:clock

+0

Dieser Abschnitt des Handbuchs auf dem neuesten Stand Arithmetik bezieht sich nicht auf das Takt Format-Befehl und Ihre is_valid_date proc ist in der Tat die Methode, die ich mit den Daten zur Validierung endete. – Jackson

+2

Der 'Clock Scan'-Befehl funktioniert auf diese Weise, da er für die Behandlung einer Reihe von Fällen in der realen Welt erforderlich ist, in denen 'clock add' nicht funktioniert. Es ist ziemlich bizarr, aber das ist Termine für Sie: Sie sind bizarr ... –