2014-04-11 16 views
7

muszę uruchomić następujący kod w mojej aplikacji Rails:Dlaczego nie można przeanalizować łańcucha daty zapisanego w zmiennej w Ruby?

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date).utc.to_date.strftime("%_m/%d")[1..-1] 

Jeżeli gra jest @games.each do |game|

Ale to nie działa, pojawia się błąd, TypeError: no implicit conversion of ActiveSupport::TimeWithZone into String.

Jednak mogę uruchomić:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse("2014-04-11 12am").utc.to_date.strftime("%_m/%d")[1..-1] 

która zwraca „4/11”

Jak mogę wykorzystać powyższy kod z `game.date” zamiast zakodowanego ciągu?

obiekt EDIT

Gra wygląda następująco (od db/seeds.rb):

Game.create(id: 9, date: "2014-04-11 12am", time: "705PM", opponent: "Jacksonville", away: false, event: "friday night fireworks") 

EDIT 2

W konsoli szyn Kiedy zrobić grę .date zwraca:

Fri, 11 Apr 2014 00:00:00 UTC +00:00 

, więc wydaje się, że nie jest ciągiem znaków.

+0

jest 'game.date' ciąg lub inną datę typu obiektu? – lurker

+0

Czy możesz wysłać przykładowy obiekt gry lub tablicę gier? –

+0

Edytowałem moje pytanie. Dzięki! – reknirt

Odpowiedz

13

aby to, co starasz się zrobić pracę, trzeba przekonwertować datę na łańcuch z to_s:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date.to_s).utc.to_date.strftime("%_m/%d")[1..-1] 

Należy jednak zastanowić się, czy to jest naprawdę to, co chcesz zrobić. W obecnej wersji kod ten przyjmuje datę, przekształcając go w ciąg znaków, analizując ciąg znaków, aby powrócić do daty, a następnie przekształcając go w ciąg znaków po raz drugi. Jesteś pewien, że nie mogłeś sobie poradzić z czymś takim?

game.date.strftime(%_m/%d")[1..-1] 
+1

.to_s był super pomocny. Dzięki. –

2

ActiveSupport::TimeZone.parse potrzebuje ciąg, a nie przykładem Date obiektu poniżej:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(Date.current.to_s).utc.to_date.strftime("%_m/%d")[1..-1] 
#=> "4/11" 

więc zmienić:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date).utc.to_date.strftime("%_m/%d")[1..-1] 

do:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date.to_s).utc.to_date.strftime("%_m/%d")[1..-1] 
2

Można użyć poniżej napisu :

Jak sędziował dokumentacji http://rubyinrails.com/2013/09/strftime-format-time-in-ruby/

game.date.strftime("%Y-%m-%d %I:%M%P") 
#output=> "2014-04-11 12am" 

Więc w pętli można użyć:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date.strftime("%Y-%m-%d %I:%M%P")).utc.to_date.strftime("%_m/%d")[1..-1]