【问题标题】:How can I tell if an object is a "date-y" type of object in Ruby (convertable to a unix timestamp)如何判断一个对象是否是 Ruby 中的“date-y”类型的对象(可转换为 unix 时间戳)
【发布时间】:2013-12-06 16:23:26
【问题描述】:

具体来说,如果一个对象可以转换为 unix 时间戳,我想将其转换为 unix 时间戳。这样我就可以覆盖标准的日期/时间 JSON 格式,ruby 将其转换为 API 的 unix 时间戳(因为我们不想在电话端解析字符串)。而且,我有点想这样做一次,这样我就可以在我们任何使用日期/时间的对象中使用它(通过修改 as_json 的结果)。

似乎我目前必须处理日期、时间、日期时间(如果类型检查则由日期处理)和 ActiveSupport::TimeWithZone(来自 Rails)。但是,不想检查所有这些。

有更好的方法吗?

仅供参考,我尝试检查 respond_to?(:to_datetime) 这是不好的,因为 String 对此作出响应。并且 respond_to?(:year) 不好,因为 FixedNum 对此做出了回应。 :-P

【问题讨论】:

  • 我想我真的可以检查 kind_of?(Date) 和 kind_of?(Time)...刚刚注意到 ActiveSupport::TimeWithZone 派生自 Time。嗯,在回答之前会等待看看是否其他人有更好的建议。 :)
  • 在 ruby​​ 中的日期/时间调用 to_i 将返回 unix 时间戳
  • 是的,但是您可以在各种不是日期的对象上调用 to_i。我只想转换为日期类型对象的时间戳。在大多数语言中,我会检查它是否实现了某种日期接口(或响应专门用于获取时间戳的选择器)。

标签: ruby-on-rails ruby date unix datetime


【解决方案1】:

而不是使用respond_to?

你为什么不这样做:

def date_or_time?(obj)
  obj.kind_of?(Date) || obj.kind_of?(Time)
end

[19] pry(main)> a = Date.new
=> #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
[20] pry(main)> date_or_time? a
=> true
[21] pry(main)> b = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
[22] pry(main)> date_or_time? b
=> true
[23] pry(main)> c = Time.new
=> 2013-12-06 10:44:57 -0600
[24] pry(main)> date_or_time? c
=> true

【讨论】:

  • 在上面看到他的评论
  • 是的,这基本上就是我要去的。猜猜任何日期类型的对象都可能派生自日期或时间。我会接受你的回答,因为我没有自己提出。 :)
【解决方案2】:

或者,您仍然可以将respond_to?:iso8601 一起使用。我相信只有“日期-y”类型会对此做出响应(日期、时间、日期时间)。

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2011-11-28
    • 2011-04-25
    相关资源
    最近更新 更多