【问题标题】:Why can't I parse a date string saved to a variable in Ruby?为什么我不能解析保存到 Ruby 中变量的日期字符串?
【发布时间】:2014-05-26 04:52:33
【问题描述】:

我需要在我的 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

在我执行 game.date 时,在 Rails 控制台中它返回:

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

所以它似乎不是一个字符串。

【问题讨论】:

  • game.date 是字符串还是其他日期对象类型?
  • 您能发布示例游戏对象或@game 数组吗?
  • 我编辑了我的问题。谢谢!
  • 因为在控制台中#to_s 被控制台中的Date 对象调用。
  • 有什么方法可以解析 Date 对象?

标签: ruby-on-rails ruby activesupport


【解决方案1】:

要使您尝试做的工作,您需要使用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]

【讨论】:

    【解决方案2】:

    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】:

      您可以使用以下字符串:

      参考文档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]
      

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 2017-08-28
        相关资源
        最近更新 更多