Ich habe eine Zeichenfolge: "31-02-2010"
und möchte überprüfen, ob es sich um ein gültiges Datum handelt. Was ist der beste Weg, um es zu tun?
Ich benötige eine Methode, die true zurückgibt, wenn die Zeichenfolge ein gültiges Datum ist, und false, wenn dies nicht der Fall ist.
ruby-on-rails
ruby
string
date
Salil
quelle
quelle
Antworten:
quelle
Hier ist ein einfacher Einzeiler:
Ich würde wahrscheinlich nicht empfehlen, genau dies in jeder Situation im wirklichen Leben zu tun, da Sie den Anrufer zwingen, nach Null zu suchen, z. besonders beim Formatieren. Wenn Sie ein Standarddatum | Fehler zurückgeben, ist es möglicherweise freundlicher.
quelle
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
wird abgeraten.quelle
is_valid?
? Versuchte 1.8, 2.0 und 2.1. Keiner von ihnen scheint diesen zu haben. Alle scheinen es jedoch zu habenvalid_date?
.Parsing-Daten können in einigen Fallstricken auftreten, insbesondere wenn sie im Format MM / TT / JJJJ oder TT / MM / JJJJ vorliegen, z. B. kurze Daten, die in den USA oder in Europa verwendet werden.
Date#parse
Versuche herauszufinden, welche verwendet werden sollen, aber es gibt viele Tage im Monat im Jahr, an denen Mehrdeutigkeiten zwischen den Formaten zu Analyseproblemen führen können.Ich würde empfehlen, herauszufinden, wie hoch die LOCALE des Benutzers ist. Auf dieser Grundlage wissen Sie dann, wie Sie intelligent analysieren können
Date.strptime
. Der beste Weg, um herauszufinden, wo sich ein Benutzer befindet, besteht darin, ihn bei der Anmeldung zu fragen und dann in seinen Einstellungen eine Einstellung anzugeben, um ihn zu ändern. Angenommen, Sie können es durch eine clevere Heuristik ausgraben und den Benutzer nicht für diese Informationen stören, ist dies fehleranfällig. Fragen Sie einfach.Dies ist ein Test mit
Date.parse
. Ich bin in den USA:Das erste war das richtige Format für die USA: MM / TT / JJJJ, aber Date mochte es nicht. Die zweite war für Europa richtig, aber wenn Ihre Kunden überwiegend in den USA ansässig sind, erhalten Sie viele schlecht analysierte Daten.
Ruby's
Date.strptime
wird verwendet wie:quelle
01/01/2014
, welcher ist der Monat und welcher der Tag? Im US-Monat wäre es der erste, im Rest der Welt der zweite.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
quelle
require "date"
sonst erhalten Sie "undefinierte Methode".Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Ich möchte den
Date
Unterricht verlängern .Beispiel
quelle
Eine andere Möglichkeit, das Datum zu validieren:
quelle
Versuchen Sie Regex für alle Daten:
Für nur Ihr Format mit führenden Nullen, das letzte Jahr und Bindestriche:
das [- /] bedeutet entweder - oder /, der Schrägstrich muss maskiert werden. Sie können dies auf http://gskinner.com/RegExr/ testen.
Wenn Sie die folgenden Zeilen hinzufügen, werden sie alle hervorgehoben, wenn Sie den ersten regulären Ausdruck ohne das erste und das letzte / verwenden (sie sind für die Verwendung im Ruby-Code vorgesehen).
quelle
32-13-2010
die beispielsweise falsch sind.'00/00/0000'
und'99-99/9999'
mögliche Kandidaten bedeutet.Eine strengere Lösung
Es ist einfacher, die Richtigkeit eines Datums zu überprüfen, wenn Sie das erwartete Datumsformat angeben. Trotzdem ist Ruby für meinen Anwendungsfall etwas zu tolerant:
Es ist klar, dass mindestens eine dieser Zeichenfolgen den falschen Wochentag angibt, aber Ruby ignoriert dies gerne.
Hier ist eine Methode, die dies nicht tut. Es wird überprüft, ob es
date.strftime(format)
wieder in dieselbe Eingabezeichenfolge konvertiert wird, mit der esDate.strptime
gemäß analysiert wurdeformat
.quelle
Date.today().iso8601
);%m
ist null gepolstert. Wenn Sie etwas anderes wollen, sehen Sie ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Posten Sie dies, weil es später für jemanden von Nutzen sein könnte. Keine Ahnung, ob dies ein "guter" Weg ist oder nicht, aber es funktioniert für mich und ist erweiterbar.
Mit diesem Add-On für die String-Klasse können Sie Ihre Liste der Trennzeichen in Zeile 4 und anschließend Ihre Liste der gültigen Formate in Zeile 5 angeben.
quelle
quelle
Sie können Folgendes versuchen: Dies ist der einfache Weg:
Aber Sie müssen die Ausnahme behandeln.
quelle
Date.parse hat für diese Beispiele keine Ausnahme ausgelöst:
Ich bevorzuge diese Lösung:
quelle
Methode:
Verwendung:
Dies gibt true oder false zurück, wenn config [: date] = "12/10 / 2012,05 / 09/1520"
quelle