【问题标题】:Why DateTime.new returns year only?为什么 DateTime.new 只返回年份?
【发布时间】:2019-04-25 02:19:45
【问题描述】:

我想从 YAML 文件中将 DateTime 播种到 seed.rb 中

这是来自seeds.rb的代码

created_at: DateTime.new("#{post['created_at']}".to_i)

在帖子 YAML 文件中:

created_at: 2010-04-16

这个的输出是created_at: "2010-01-01 00:00:00"

问题是:在YAML文件中create_at应该采用什么格式?

【问题讨论】:

    标签: ruby-on-rails ruby date yaml seed


    【解决方案1】:

    使用DateTime#parse:

    DateTime.parse('2010-04-16')
    #⇒ Fri, 16 Apr 2010 00:00:00 +0000
    

    你的例子:

    created_at: DateTime.parse(post['created_at'])
    

    如果post['created_at'] 已经是DateTime 的实例(例如,加载了 YAML),则按原样分配它:

    created_at: post['created_at']
    

    【讨论】:

    • 出现错误:TypeError: 没有将 DateTime 隐式转换为 String
    • 该错误消息很可能意味着post['created_at'] 已经是DateTime 实例,您无需对其进行任何操作。
    • 是的,实际上我不需要添加 DateTime.parse 或 DateTime.new,只需 post['created_at'] 工作 :) 谢谢
    【解决方案2】:

    当您检查 "2010-04-16".to_i 时,您会得到 2010。因此您调用 DateTime.new(2010) 并得到您所看到的结果。

    您不能使用字符串本身,DateTime.new("2010-04-16") 会出现类型错误。

    但是 Yaml 在解析 2010-04-16 时已经转换为 Date,所以我猜你可以使用 post['created_at'].to_datetime

    完整的原始红宝石示例:

    require 'yaml'
    require 'date'
    post = YAML.load('created_at: 2010-04-16')
    p post['created_at']  #-> #<Date: 2010-04-16 ((2455303j,0s,0n),+0s,2299161j)>
    p post['created_at'].to_datetime #-> #<DateTime: 2010-04-16T00:00:00+00:00 ((2455303j,0s,0n),+0s,2299161j)>
    

    你的seeds.rb可能看起来像

    created_at: post['created_at'].to_datetime
    

    【讨论】:

    • 我得到一个 ArgumentError:比较 DateTime 与 0 失败
    • DateTime.new 在最后一行看起来有点多余:)
    • @AlekseiMatiushkin 你是对的 ;) 我更正了它
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2023-03-23
    • 2016-12-05
    相关资源
    最近更新 更多