2014-04-11 16 views
7

tôi cần để chạy các đoạn mã sau trong ứng dụng Rails của tôi:Tại sao tôi không thể phân tích một chuỗi ngày được lưu vào một biến trong Ruby?

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

đâu trò chơi là @games.each do |game|

Nhưng điều này không làm việc, tôi nhận được lỗi, TypeError: no implicit conversion of ActiveSupport::TimeWithZone into String.

Tuy nhiên, tôi có thể chạy:

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

trả về "4/11"

Làm thế nào tôi có thể sử dụng đoạn mã trên với `game.date' thay vì chuỗi cứng mã hóa?

EDIT

một trò chơi đối tượng trông giống như sau (từ db/seeds.rb):

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

EDIT 2

Trong ray console khi tôi làm trò chơi .date it trả về:

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

vì vậy có vẻ như nó không phải là một chuỗi.

+0

là 'game.date' một chuỗi hoặc một loại đối tượng hẹn hò? – lurker

+0

Bạn có thể vui lòng đăng đối tượng trò chơi mẫu hoặc mảng @game không? –

+0

Tôi đã chỉnh sửa câu hỏi của mình. Cảm ơn! – reknirt

Trả lời

13

Để thực hiện những gì bạn đang cố gắng làm việc, bạn cần phải chuyển đổi ngày của bạn thành một chuỗi với to_s:

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

Tuy nhiên, bạn nên cân nhắc xem điều này thực sự là những gì bạn muốn làm. Hiện tại, mã này đang lấy ngày, chuyển đổi nó thành một chuỗi, phân tích cú pháp chuỗi để quay lại ngày, sau đó chuyển đổi nó thành chuỗi một lần thứ hai. Bạn có chắc bạn không thể có được bằng một cái gì đó như thế này?

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

.to_s là siêu hữu ích. Cảm ơn. –

2

ActiveSupport::TimeZone.parse cần một chuỗi và không phải là một ví dụ Date đối tượng dưới đây:

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

nên thay đổi:

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

tới:

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

Bạn có thể sử dụng dưới chuỗi :

Như tham khảo nhiều tài liệu về http://rubyinrails.com/2013/09/strftime-format-time-in-ruby/

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

Vì vậy, trong vòng lặp của bạn, bạn có thể sử dụng:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse(game.date.strftime("%Y-%m-%d %I:%M%P")).utc.to_date.strftime("%_m/%d")[1..-1] 
Các vấn đề liên quan