如何判断一个对象是否是Ruby中的“date-y”类型的对象(可转换为unix时间戳)

问题描述 投票:7回答:2

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

好像我目前要处理Date,Time,DateTime(由Date进行类型检查处理)和ActiveSupport :: TimeWithZone(来自Rails)。但是,不想要检查所有这些。

有更好的方法吗?

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

ruby-on-rails ruby date unix datetime
2个回答
8
投票

而不是使用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

0
投票

或者你仍然可以使用respond_to?:iso8601。我相信只有'date-y'类型会响应(Date,Time,DateTime)。

© www.soinside.com 2019 - 2024. All rights reserved.