Mam ciąg: "31-02-2010"
i chcę sprawdzić, czy jest to ważna data. Jak najlepiej to zrobić?
Potrzebuję metody, która zwraca prawdę, jeśli ciąg jest prawidłową datą i fałsz, jeśli nie jest.
ruby-on-rails
ruby
string
date
Salil
źródło
źródło
Odpowiedzi:
źródło
Oto prosta jedna wkładka:
Prawdopodobnie nie polecałbym robienia tego dokładnie w każdej sytuacji w prawdziwym życiu, ponieważ zmuszasz dzwoniącego do sprawdzenia, czy nie ma zera, np. szczególnie podczas formatowania. Jeśli zwrócisz domyślną datę | błąd, może to być bardziej przyjazne.
źródło
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
jest odradzane.źródło
is_valid?
? Wypróbowano 1.8, 2.0 i 2.1. Żaden z nich nie wydaje się mieć tego. Wydaje się jednakvalid_date?
, że wszyscy mają .Parsowanie dat może napotkać pewne problemy, zwłaszcza gdy są one w formacie MM / DD / RRRR lub DD / MM / RRRR, na przykład krótkie daty używane w USA lub Europie.
Date#parse
próbuje dowiedzieć się, którego użyć, ale jest wiele dni w miesiącu w ciągu roku, kiedy niejednoznaczność między formatami może powodować problemy z analizą.Radziłbym dowiedzieć się, jakie jest LOCALE użytkownika, a następnie na tej podstawie będziesz wiedział, jak inteligentnie analizować za pomocą
Date.strptime
. Najlepszym sposobem, aby dowiedzieć się, gdzie znajduje się użytkownik, jest zapytanie go podczas rejestracji, a następnie podanie ustawienia w jego preferencjach, aby to zmienić. Zakładając, że możesz to wykopać za pomocą sprytnej heurystyki i nie zawracać głowy użytkownikowi tymi informacjami, jest podatne na niepowodzenie, więc po prostu zapytaj.To jest test przy użyciu
Date.parse
. Jestem w USA:Pierwszy był prawidłowym formatem dla Stanów Zjednoczonych: mm / dd / rrrr, ale data nie podobała się. Drugi był poprawny dla Europy, ale jeśli Twoi klienci pochodzą głównie z USA, otrzymasz wiele źle przeanalizowanych dat.
Ruby
Date.strptime
jest używany w następujący sposób:źródło
01/01/2014
, to który miesiąc, a który dzień? W Stanach Zjednoczonych miesiąc byłby pierwszy, reszta świata byłby drugi.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
źródło
require "date"
najpierw, albo otrzymasz „niezdefiniowaną metodę”.Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Chciałbym przedłużyć
Date
klasę.przykład
źródło
Inny sposób weryfikacji daty:
źródło
Wypróbuj wyrażenie regularne dla wszystkich dat:
Tylko dla twojego formatu z wiodącymi zerami, ostatnim rokiem i myślnikami:
[- /] oznacza albo - albo /, ukośnik musi zostać zmieniony. Możesz to przetestować na http://gskinner.com/RegExr/
dodaj następujące wiersze, wszystkie zostaną podświetlone, jeśli użyjesz pierwszego wyrażenia regularnego, bez pierwszego i ostatniego / (są one używane w kodzie ruby).
źródło
32-13-2010
błędne.'00/00/0000'
i'99-99/9999'
są potencjalnymi kandydatami.Bardziej rygorystyczne rozwiązanie
Łatwiej jest zweryfikować poprawność daty, jeśli określisz oczekiwany format daty. Jednak nawet wtedy Ruby jest trochę zbyt tolerancyjny dla mojego przypadku użycia:
Oczywiście co najmniej jeden z tych ciągów określa zły dzień tygodnia, ale Ruby szczęśliwie to ignoruje.
Oto metoda, która tego nie robi; sprawdza, czy
date.strftime(format)
konwertuje z powrotem na ten sam ciąg wejściowy, z którym był analizowanyDate.strptime
zgodnie zformat
.źródło
Date.today().iso8601
);%m
jest wypełniony zerami. Jeśli chcesz czegoś innego, zobacz ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/ ...Publikowanie tego, ponieważ może to być przydatne dla kogoś później. Nie mam pojęcia, czy jest to „dobry” sposób, aby to zrobić, czy nie, ale działa dla mnie i można go rozszerzyć.
Ten dodatek do klasy String pozwala określić listę ograniczników w linii 4, a następnie listę prawidłowych formatów w linii 5. Nie jest to fizyka jądrowa, ale bardzo ułatwia jej rozszerzenie i pozwala po prostu sprawdzić ciąg w następujący sposób:
źródło
źródło
Możesz spróbować wykonać następujące czynności, co jest prostym sposobem:
Ale musisz obsłużyć wyjątek.
źródło
Date.parse nie zgłoszono wyjątku dla tych przykładów:
Wolę takie rozwiązanie:
źródło
Metoda:
Stosowanie:
Zwraca wartość true lub false, jeśli config [: dates] = "12/10 / 2012,05 / 09/1520"
źródło