web-dev-qa-db-ja.com

Rubyの変数に保存された日付文字列を解析できないのはなぜですか?

Railsアプリで次のコードを実行する必要があります:

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

ゲームはどこにありますか@games.each do |game|

しかし、これは機能しません。エラーが発生します、TypeError: no implicit conversion of ActiveSupport::TimeWithZone into String

ただし、実行できます。

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

「4/11」を返す

ハードコードされた文字列の代わりに `game.date 'で上記のコードを使用するにはどうすればよいですか?

[〜#〜]編集[〜#〜]

gameオブジェクトは次のようになります(db/seeds.rbから):

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

編集2

Railsコンソールでgame.dateを実行すると、次のように返されます。

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

だからそれは文字列ではないようです。

11
reknirt

実行しようとしていることを機能させるには、日付をto_sを使用して文字列に変換する必要があります。

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

ただし、これが本当にやりたいことであるかどうかを検討する必要があります。現在のところ、このコードは日付を取得して文字列に変換し、文字列を解析して日付に戻し、もう一度文字列に変換しています。このようなことでうまくいかなかったのですか?

game.date.strftime(%_m/%d")[1..-1]
19
Wally Altman

以下の文字列を使用できます。

ドキュメントを参照してください http://rubyinrails.com/2013/09/strftime-format-time-in-Ruby/

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

したがって、ループでは次のものを使用できます。

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

ActiveSupport::TimeZone.parseには文字列が必要であり、以下のDateオブジェクトの例ではありません。

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

だから変更:

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

に:

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