新手问题 ruby 时间区间判断

yangxing_star · 2013年11月30日 · 最后由 josh_sulin 回复于 2015年05月23日 · 5043 次阅读

这样判断当前时间在某个区间里貌似不行,各位有木有好的办法啊?

a = 1.days.ago..1.days.from_now
a.include?(Time.now)
Time.now.zone  # 查看时区

Time.now.to_s  # 2013-11-30 16:41:27 +0800
Time.now.in_time_zone('Tokyo') # 2013-11-30 17:41:54 +0900

ActiveSupport::TimeZone.zones_map.map { |k, v| k }  # Rails 支持的时区
ActiveSupport::TimeZone[-8]  # 获取 -8:00 时区.

希望可以帮到你。

a.cover?(Time.now)

难道不是这么判断?

irb(main):001:0> a = Time.now
=> 2013-11-30 21:56:45 +0800
irb(main):002:0> b = 1.days.from_now
=> Sun, 01 Dec 2013 13:56:53 UTC +00:00
irb(main):003:0> c = 1.hours.from_now
=> Sat, 30 Nov 2013 14:57:02 UTC +00:00
irb(main):004:0> c.between?(a, b)
=> true

把 include?换成 cover?

首先你要知道你这个 time range 是很大的范围,最好改成 Date,另外判断是否在 range 里面可以用 ===

a=(1.day.ago.to_date..1.day.from_now.to_date)
a === Time.now.to_date # => true

#5 楼 @steven_yue 见识了,没用过 === 这个牛逼的方法。

#6 楼 @yangxing_star
因为 ruby 1.9.x 以上版本不支持迭代 Time 类型,所以不能直接在 Time Range 上使用===方法,但可以使用 cover?方法来判断是否在两个时间之间,如:

(Time.now..Time.now+1).cover? Time.now # => true

当然,如果非要使用===方法,就要把 Time 类型转换为支持迭代的其他类型,如 Date 或 Fixnum,如:

(Time.now.to_date..(Time.now+1).to_date) === Time.now.to_date # => true

(Time.now.to_i..Time.now.to_i+1) === Time.now.to_i # => true

不过 ruby 1.8.x 是支持在 Time 类型上使用===方法的。

between? 与 cover? 功能是一样的,我更喜欢使用 cover?,因为使用 cover? 更 ruby 些

需要 登录 后方可回复, 如果你还没有账号请 注册新账号