2014-11-22 12 views
5

Mam datę jako ciąg znaków w takim formacie: 23 Nov. 2014. Pewnie, że łatwo przekonwertować ten ciąg na bieżąco z takim wyrażeniem:Konwertowanie ciągów do tej pory z Ruby

Date.strptime(my_string, '%d %b. %Y') 

Ale jest jeden problem, gdy miesiąc maj jest - nie ma kropki, jak 23 May 2014. A moja mowa się łamie.

Czy ktoś może pomóc w rozwiązaniu tego problemu? Jak mogę wyrazić uniwersalność moich spraw?

Odpowiedz

3

Usuń okres od my_string i ze wzoru daty.

Date.strptime(my_string.sub('.', ''), '%d %b %Y') 

Zakładając masz co najwyżej jedną kropkę my_string. Jeśli jest ich kilka, użyj gsub.

Date.strptime(my_string.gsub('.', ''), '%d %b %Y') 
+1

Zamiast 'sub' lub' gsub' użyj 'tr ('.', '')'. Jest szybszy i osiągnie to samo. –

+0

... lub 'my_string.delete ('.')'. –

2

Myślę, że używasz niewłaściwej metody. Date#parse powinny pracować z prawie „nic” (patrz odpowiedź Tinman i komentarz o wyjaśnienie, gdy nie jest w użyciu parse) i zapewnić ten sam obiekt:

p Date.parse('23 Nov 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> 
p Date.parse('23 Nov. 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> same object as with the previous line 
+2

Analiza daty nie "działa z niczym", w rzeczywistości jest dość ograniczona, wolniejsza i bardziej podatna na błędy ze względu na różnice we wspólnych formatach dat między USA i resztą świata. Zamiast tego użyj 'strptime' dla formatów daty, które rozpoznajesz, i może powrócić do' parsowania'. Najlepiej poznać ustawienie LOCALE użytkownika lub po prostu pozwolić mu określić z listy alternatywnych i użyć tego. –

+0

USA kontra "reszta" świata? Uważam, że jest to raczej elitarny pogląd. Mówimy tutaj o MIĘDZYNARODOWYM formacie daty, jeśli konkretny kraj (np. USA lub jakikolwiek inny) ma określony sposób reprezentowania dat, nie można powiedzieć, że metoda analizy parse "nie działa" tylko dlatego, że nie obsługuje niektórych implementacji X kraju. – daremkd

+1

Nie ma nic "elitarnego" wspomnianego lub sugerowanego. Najczęstszy format daty w Stanach Zjednoczonych jest inny i zbyt wielu ludzi o tym nie wie. Ruby, będąc językiem międzynarodowym, robi to dobrze. Myślę, że twoja polityka jest kolorowana, jak czytasz komentarz. –

0

Sposób parse próbuje znaleźć pasujący termin lub formatów daty i czasu, następnie przeanalizuj ciąg znaków, aby zwrócić wartości użyte do utworzenia nowej daty lub daty. Obsługuje wiele różnych formatów, co jest wygodne, jednak proces skanowania w celu znalezienia dopasowania spowalnia czas analizowania.

Ponadto, niektóre formaty powszechnie używane nie muszą "pasować". Zastanów się, co się dzieje tutaj:

Date.parse '31/01/2001' 
=> #<Date: 2001-01-31 ((2451941j,0s,0n),+0s,2299161j)> 

Data ciąg w '%d/%m/%Y' (dzień, miesiąc, rok) format jest analizowany, choć nie jest to powszechne w Stanach Zjednoczonych, ponieważ Ruby nie jest językiem US-centric. Odwrócenie pierwszych dwóch pól powoduje:

Date.parse '01/31/2001' 
ArgumentError: invalid date 
    from (irb):4:in `parse' 
    from (irb):4 
    from /Users/greg/.rbenv/versions/2.1.5/bin/irb:11:in `<main>' 
irb(main):005:0> Date.parse '31/01/2001' 
+0

Tak, widzę, dzięki! I przypuszczam, że polecasz mi także usunięcie okresu z łańcucha i użycie 'strptime'? – ktaras

+1

Prawdopodobnie powinieneś znormalizować ciąg znaków, usuwając kropkę. Są sposoby obejścia tego, ale okres nie jest normalną częścią trzyliterowej nazwy miesiąca. –

Powiązane problemy