Tu z pomocą przychodzi gem w Ruby co się zowie 'chronic'. Najpierw zainstalujmy gema (niestety nie ma go w portage'u - przynajmniej głownym repo):
gem install chronic
I już mamy gema.
Pobawmy się tym trochę w irb (interaktywny interpreter Ruby - czy jakkolwiek to nazwać)
ja@komp ~ $ irb
irb(main):001:0> require 'chronic'
=> true
irb(main):002:0> Chronic.parse("yesterday")
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):003:0> Chronic.parse("yesterday").class
=> Time
irb(main):004:0>
Jak widać chronic zwraca obiekt klasy Time - klasa wbudowana w Ruby (standard library). Umożliwia nam to proste operowanie w kodzie np. do generowania zapytań SQL (klauzula where time ...)
Oczywiście to dopiero początek:
irb(main):005:0> Chronic.parse("last friday")
=> Fri Oct 30 12:00:00 +0100 2009
irb(main):006:0> Chronic.parse("last friday at 5pm")
=> Fri Oct 30 17:00:00 +0100 2009
irb(main):007:0> Chronic.parse("last month")
=> Fri Oct 16 12:30:00 +0200 2009
irb(main):008:0> Chronic.parse("last wednesday")
=> Wed Nov 04 12:00:00 +0100 2009
To zaledwie parę przykładów - tak żeby pokazać co potrafi sparsować chronic.
Ważnym parametrem przy parsowaniu jest kontekst czasu - w skrócie czy chronic ma szukać w pasującej do opisu daty przeszłości czy w przyszłości:
irb(main):010:0> Chronic.parse("wednesday", :context => :past)
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):011:0> Chronic.parse("wednesday", :context => :future)
=> Wed Nov 11 12:00:00 +0100 2009
irb(main):012:0> Chronic.parse("wednesday")
=> Wed Nov 11 12:00:00 +0100 2009
Jak widać domyślnym kontekstem jest :future.
Opcja :now umożliwia zdefiniowanie daty, która ma być przez parser traktowana jako data aktualna (odnośnik czasowy w stosunku do którego ma być wykonane obliczenie). Domyślnie jest to czas bieżący:
irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005
Opcja :ambiguous_time_range umożliwia określenie przedziału czasowego, w którym będzie poszukiwana punkt w czasie - zobaczmy to na przykładzie:
irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005
irb(main):020:0> Chronic.parse("wednesday 6:00", :ambiguous_time_range => 5)
=> Wed Nov 11 06:00:00 +0100 2009
irb(main):021:0> Chronic.parse("wednesday 4:00", :ambiguous_time_range => 5)
=> Wed Nov 11 16:00:00 +0100 2009
Określiłem przeszukiwany przedział czasowy na 5am-5pm - jak widać zwrócone czasy zawierają się w zdefiniowanym przeze mnie przedziale.
Pozostaje jeszcze opcja :guess - to już pozostawiam czytelnikowi
Przydatne linki:
Chronic gem
Na nowym portalu:
Gemcutter gems - chronic
dziendobry
OdpowiedzUsuńnie rozumiem ... ambigious.range ....czy mozna jasniej
ps
zfrustroway czytelnik
ps
po za tym bomba ... albo bąba .. nie pamietam ;)
Najlepiej to potestować - myślę, że dosyc jasno to wytłumaczyłem. Poza tym zbyt ogólnie sformułowałeś problem - czego dokładnie nie rozumiesz? Czy spróbowałeś sam to potestować?
OdpowiedzUsuń