2010-05-11 15 views
6

Wyciągam dane z kanału, nad którym nie mam kontroli, i muszę sprawdzić, czy podany ciąg jest prawidłowym czasem.Ruby: Jak sprawdzić, czy ciąg znaków jest prawidłowym czasem?

Przez większość czasu wysyłano mi coś w stylu "2:35" lub "15:41", ale w innych przypadkach takie rzeczy jak "AM" lub "PM" (bez numerów) ... więc ostatecznie po prostu trzeba je zignorować.

Jak zatem sprawdzić, czy dane są prawidłowe?

Odpowiedz

8

Można użyć Time.parse() i sprawdzić za wyjątkiem ArgumentError na nieważne czasy.

Dodatkową zaletą jest to, że masz również czas w użytecznym formacie do pracy, jeśli jest on ważny!

+6

Nie używaj analizatora do sprawdzania poprawności! Time.parse ('2: 34-^5') # => 2012-08-14 02:34:00 -0400 – Bob

+5

Użycie funkcji parse do sprawdzenia poprawności może spowodować utratę niepoprawnych czasów, np .: 'Time.parse ('27 : 45 PM ")' => 2012-12-04 15:45:00 -0500 – tjstankus

7

Nie dokładnie określone, co można zakładać, aby być poprawny czas (na przykład, czy należy przyjąć opcjonalnych sekund), tak oto jeden przypuszczenie:

data =~ /^([01]?[0-9]|2[0-3])\:[0-5][0-9]$/ 
+0

Chociaż Time.parse() z ratunkiem może pracować, wolałbym rozwiązanie regex. Wyjątki w rubinie nie są uważane za bardzo szybkie, więc jeśli nie potrzebujesz obiektu czasu, to jest to rada, z którą chciałbym poradzić. –

+0

Używanie regex przynosi same problemy: wiele różnych formatów czasu sprawia, że ​​bardzo skomplikowane jest sprawdzenie, czy dany czas jest prawidłowy. Gdy chcesz obsługiwać wszystkie/najbardziej możliwe formaty czasu, w zasadzie ponownie wdrażasz metodę 'Time.parse()' ... – Veger

+3

Wszystko zależy od tego, jak bardzo chcesz być przy przyjmowaniu wartości. Zakładałem maksymalną rygorystyczność (tylko opcjonalna rzecz to wiodące zero w godzinach). Pytanie nie określa. Poza tym, 'Time.parse' wydaje się naprawdę bardzo liberalny, jeśli chodzi o argumenty. Spróbuj na przykład: 'Time.parse '10'' i' Time.parse' asd''. Żaden nie zgłasza wyjątku (przynajmniej w wersji 1.9.1). Naprawdę nie mógłbym na tym polegać. –

Powiązane problemy