Ruby:创建日期范围

斯特凡

我正在寻找一种制作日期范围的优雅方法,例如:

def DateRange(start_time, end_time, period)
  ...
end

>> results = DateRange(DateTime.new(2013,10,10,12), DateTime.new(2013,10,10,14), :hourly)
>> puts results
2013-10-10:12:00:00
2013-10-10:13:00:00
2013-10-10:14:00:00

该步骤应该是可配置的,例如每小时,每天,每月。

我想times做到包容,即包括end_time

附加要求是:

  • 应保留原始时区,即,如果它与本地时区不同,则仍应保留。
  • 应该使用适当的高级方法(例如Rails :advance)来处理诸如数月之内的可变天数之类的事情。
  • 理想情况下,性能会很好,但这不是主要要求。

有一个优雅的解决方案吗?

丹牛

使用@CaptainPete的基础,我对其进行了修改以使用该ActiveSupport::DateTime#advance调用。当时间间隔不一致时,例如`:month“和”:year“,差异将生效。

require 'active_support/all'
class RailsDateRange < Range
  # step is similar to DateTime#advance argument
  def every(step, &block)
    c_time = self.begin.to_datetime
    finish_time = self.end.to_datetime
    foo_compare = self.exclude_end? ? :< : :<=

    arr = []
    while c_time.send( foo_compare, finish_time) do 
      arr << c_time
      c_time = c_time.advance(step)
    end

    return arr
  end
end

# Convenience method
def RailsDateRange(range)
  RailsDateRange.new(range.begin, range.end, range.exclude_end?)
end

我的方法还返回Array为了比较起见,我更改了@CaptainPete的答案以也返回一个数组:

按小时

RailsDateRange((4.years.ago)..Time.now).every(years: 1)
=> [Tue, 13 Oct 2009 11:30:07 -0400,
 Wed, 13 Oct 2010 11:30:07 -0400,
 Thu, 13 Oct 2011 11:30:07 -0400,
 Sat, 13 Oct 2012 11:30:07 -0400,
 Sun, 13 Oct 2013 11:30:07 -0400]


DateRange((4.years.ago)..Time.now).every(1.year)
=> [2009-10-13 11:30:07 -0400,
 2010-10-13 17:30:07 -0400,
 2011-10-13 23:30:07 -0400,
 2012-10-13 05:30:07 -0400,
 2013-10-13 11:30:07 -0400]

按月

RailsDateRange((5.months.ago)..Time.now).every(months: 1)
=> [Mon, 13 May 2013 11:31:55 -0400,
 Thu, 13 Jun 2013 11:31:55 -0400,
 Sat, 13 Jul 2013 11:31:55 -0400,
 Tue, 13 Aug 2013 11:31:55 -0400,
 Fri, 13 Sep 2013 11:31:55 -0400,
 Sun, 13 Oct 2013 11:31:55 -0400]

DateRange((5.months.ago)..Time.now).every(1.month)
=> [2013-05-13 11:31:55 -0400,
 2013-06-12 11:31:55 -0400,
 2013-07-12 11:31:55 -0400,
 2013-08-11 11:31:55 -0400,
 2013-09-10 11:31:55 -0400,
 2013-10-10 11:31:55 -0400]

按年份

RailsDateRange((4.years.ago)..Time.now).every(years: 1)

=> [Tue, 13 Oct 2009 11:30:07 -0400,
 Wed, 13 Oct 2010 11:30:07 -0400,
 Thu, 13 Oct 2011 11:30:07 -0400,
 Sat, 13 Oct 2012 11:30:07 -0400,
 Sun, 13 Oct 2013 11:30:07 -0400]

DateRange((4.years.ago)..Time.now).every(1.year)

=> [2009-10-13 11:30:07 -0400,
 2010-10-13 17:30:07 -0400,
 2011-10-13 23:30:07 -0400,
 2012-10-13 05:30:07 -0400,
 2013-10-13 11:30:07 -0400]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

熊猫:创建日期范围

来自分类Dev

Ruby日期范围到Hash

来自分类Dev

根据日期范围创建多行

来自分类Dev

无法使用引导用户界面创建日期范围/日期范围

来自分类Dev

无法使用引导用户界面创建日期范围/日期范围

来自分类Dev

在Ruby / Rails中的日期范围查询

来自分类Dev

Ruby on Rails选择日期范围

来自分类Dev

使用Ruby的随机日期范围的Mockaroo公式

来自分类Dev

Ruby 中的日期范围过滤器

来自分类Dev

如何在R中创建日期范围

来自分类Dev

使用pikaday datepicker创建日期范围字段

来自分类Dev

查找在日期范围之间创建的文件

来自分类Dev

熊猫创建没有周末的日期范围

来自分类Dev

从日期范围嵌套字段创建DataFrame行

来自分类Dev

根据日期列表创建数据范围

来自分类Dev

在模型范围之间创建日期

来自分类Dev

使用pikaday datepicker创建日期范围字段

来自分类Dev

Excel If语句创建滚动日期范围

来自分类Dev

使用 Max date 创建日期范围

来自分类Dev

基于 R 中的日期范围创建列

来自分类Dev

在Ruby中创建IP地址范围

来自分类Dev

在Ruby中创建IP地址范围

来自分类Dev

SQL Union作为子查询以从开始日期创建日期范围

来自分类Dev

从 Pandas 中的日期范围创建随机排序的日期

来自分类Dev

如何检查日期范围是否在 Ruby 中的另一个日期范围之间

来自分类Dev

根据唯一的日期和时间范围列表创建日期时间范围

来自分类Dev

Ruby-获取两个日期之间的月份范围

来自分类Dev

Ruby:按年份和月份对日期范围进行分组

来自分类Dev

Ruby on Rails:如何根据日期范围查询关系对象