【问题标题】:rails dates with json带有 json 的 Rails 日期
【发布时间】:2010-05-30 06:20:57
【问题描述】:

我正在实现一个 Facebook 应用程序并使用 AJAX/JSON

但是返回的 JSON 结构具有这种格式2010-05-30T06:14:00Z

我在控制器操作中调用Game.all.to_json

如何将它们转换为正常的日期格式?

使用 fbjs 从服务器端还是客户端更容易做到这一点? fbjs 有很多错误。

所以我更喜欢使用Server side 中的解决方案(Active Records)。就像在发送 JSON 结构之前转换数据一样。

【问题讨论】:

标签: ruby-on-rails json activerecord


【解决方案1】:

我将自己的自定义格式添加到返回的 json 中的方法是向 ActiveSupport TimeWithZone 类添加猴子补丁。

在 config/initializers 文件夹中添加一个文件,内容如下:

class ActiveSupport::TimeWithZone
    def as_json(options = {})
        strftime('%Y-%m-%d %H:%M:%S')
    end
end

【讨论】:

  • 这对我很有用,但现在我正在尝试对 Date 对象做类似的事情(使用 date_select 返回)。我尝试用 ActiveSupport::Date 替换 ActiveSupport::TimeWithZone,但没有任何乐趣。任何帮助,将不胜感激。谢谢。
  • 为时区添加 %z 可能会有所帮助。
  • @Geekygecko 我赞成你的回答。我使用了这种方法,它适用于与模型关联的日期时间字段,而不适用于带有连接的 AREL 查询中其他表的日期时间字段。
  • 好的,这里有个问题:这不是完全破坏了原始 as_json 函数的功能吗?如果不是,为什么不呢?见stackoverflow.com/questions/9280744/…
  • 有时区,strftime('%Y-%m-%d %H:%M:%S %z')
【解决方案2】:

时区适用于所有主要浏览器和 ie7+:

class ActiveSupport::TimeWithZone
  def as_json(options = {})
    strftime('%Y/%m/%d %H:%M:%S %z')
  end
end

【讨论】:

    【解决方案3】:

    Rails 现在在 DateTime 对象上具有 .as_json 方法。生活变得更轻松。

    【讨论】:

      【解决方案4】:

      如果您想使用客户端 javascript 执行此操作,您可以使用以下内容解析单个日期:

      prettyDate = function(dateString) {
        var day, formatted, jsDate, month;
      
        jsDate = new Date(dateString);
        day = jsDate.getMonth() + 1 < 10 ? "0" + (jsDate.getMonth() + 1) : "" + (jsDate.getMonth() + 1);
        month = jsDate.getDate() < 10 ? "0" + (jsDate.getDate()) : "" + (jsDate.getDate());
      
        formatted = "" + day + "/" + month + "/" + (jsDate.getFullYear());
        return formatted;
      };
      

      当然,如果您需要格式化时间,您将需要一些额外的代码。

      【讨论】:

        【解决方案5】:

        您可以将模型中的 as_json 方法覆盖为:

        class Game
          def as_json(options = {})
            super.merge(time: time.strftime('%d.%m.%Y %H:%M:%S'))
          end
        end
        

        【讨论】:

          【解决方案6】:

          在服务器端绝对更容易做到这一点。您可以执行 gsub 正则表达式将其放入您想要的格式,或者 time.strftime,然后使用该字符串生成您的 json。

          【讨论】:

            【解决方案7】:
            Time.parse < datetime >
            

            简单。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-15
              • 1970-01-01
              • 2010-12-12
              • 1970-01-01
              相关资源
              最近更新 更多