Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby/Rails中对一系列日期进行分组的最佳方法是什么?_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 在Ruby/Rails中对一系列日期进行分组的最佳方法是什么?

Ruby on rails 在Ruby/Rails中对一系列日期进行分组的最佳方法是什么?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,从一系列日期来看 arr = ["2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09", "2020-02-12", "2020-02-13", "2020-02-14"] 我们如何对它们进行分组,例如输出如下: ["Ja

从一系列日期来看

arr = ["2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08",
       "2020-01-09", "2020-02-12", "2020-02-13", "2020-02-14"]     
我们如何对它们进行分组,例如输出如下:

["Jan 5th - Jan 9th", "Feb 12th - Feb 14th"]

在此范围内的日期应如上所述进行分组。众所周知,arr的所有要素的年份都是相同的,因此可以忽略不计。

您可以按如下方式进行操作

arr = ["2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09", "2020-02-12", "2020-02-13", "2020-02-14"]
arr
  .map { |d| Date.parse(d) }
  .group_by { |d| d.month }
  .sort
  .map do |d| 
    dt = d.last
    min = dt.min
    max = dt.max

    "#{min.strftime('%b')} #{min.day.ordinalize} - #{max.strftime('%b')} #{dt.max.day.ordinalize}"
   end
require 'date'

ORDINAL = { 1=>"st", 2=>"nd", 3=>"rd" }.tap { |h| h.default = "th" } 

arr.group_by { |s| s[5,2] }.
    map do |mon, arr|
      mon_name = Date::ABBR_MONTHNAMES[mon.to_i]
      first_day, last_day = arr.map { |s| s[-2,2].to_i }.minmax.
        map { |d| "%d%s" % [d, ORDINAL[d%10]] }
      "%s %s - % s %s" % [mon_name, first_day, mon_name, last_day]
    end
  #=> ["Jan 5th - Jan 9th", "Feb 12nd - Feb 14th"] 
步骤如下:

ORDINAL = { 1=>"st", 2=>"nd", 3=>"rd" }.tap { |h| h.default = "th" }

其余步骤与此类似。

您可以按如下方式执行

require 'date'

ORDINAL = { 1=>"st", 2=>"nd", 3=>"rd" }.tap { |h| h.default = "th" } 

arr.group_by { |s| s[5,2] }.
    map do |mon, arr|
      mon_name = Date::ABBR_MONTHNAMES[mon.to_i]
      first_day, last_day = arr.map { |s| s[-2,2].to_i }.minmax.
        map { |d| "%d%s" % [d, ORDINAL[d%10]] }
      "%s %s - % s %s" % [mon_name, first_day, mon_name, last_day]
    end
  #=> ["Jan 5th - Jan 9th", "Feb 12nd - Feb 14th"] 
步骤如下:

ORDINAL = { 1=>"st", 2=>"nd", 3=>"rd" }.tap { |h| h.default = "th" }

其余步骤类似。

我认为您可以将它们转换为日期,按月份分组,并按最小值映射:


to_s:long_序数是获取格式化字符串。

我想你可以将它们转换为to_date,按月份分组,按最小值映射:


to_s:long_序数是获取格式化字符串。

没有其他答案处理同一个月内的单日和连续多天运行:

日期=[2020-01-052020-01-062020-01-07, 2020-01-09, 2020-01-12, 2020-01-13, 2020-01-14, 2020-02-121020-02-132020-02-14]。地图和日期。方法:解析 def ordinalizenum 序数={1=>:st,2=>:nd,3=>:rd,4=>:th} ord_num=11..13.保护层?数量abs%100?4:num.abs {num}{ordinals[ord_num]} 终止 grouped=dates.sort.chunk_而{| a,b | a+1==b}.map&:minmax.map&:uniq grouped.map do | group| group.map{| date | date.strftime%b{ordinalizedate.day}}.join- 终止 =>[1月5日至1月7日、1月9日、1月12日至1月14日、2月12日至2月14日]
mini bonus恰好不依赖于ActiveSupport

没有其他答案可以处理同一个月内的单日和连续多天运行:

日期=[2020-01-052020-01-062020-01-07, 2020-01-09, 2020-01-12, 2020-01-13, 2020-01-14, 2020-02-121020-02-132020-02-14]。地图和日期。方法:解析 def ordinalizenum 序数={1=>:st,2=>:nd,3=>:rd,4=>:th} ord_num=11..13.保护层?数量abs%100?4:num.abs {num}{ordinals[ord_num]} 终止 grouped=dates.sort.chunk_而{| a,b | a+1==b}.map&:minmax.map&:uniq grouped.map do | group| group.map{| date | date.strftime%b{ordinalizedate.day}}.join- 终止 =>[1月5日至1月7日、1月9日、1月12日至1月14日、2月12日至2月14日]
迷你奖金,恰巧对ActiveSupport没有依赖性

您是否忽略了这一年?为什么是1月5日至1月9日?为什么不是1月3日到1月7日?1月10日之类的日期呢?代码,我相信我的编辑与您想要回答的问题是一致的。您是否忽略了年份?为什么是1月5日至1月9日?为什么不是1月3日到1月7日?1月10日之类的日期呢?代码,我相信我的编辑与您想要回答的问题是一致的。比我下面的答案短。不错!我认为arr.map&:to|date.chunk_,而{a,b|a==b.prev_day}更像这个问题。将连续天数分组,而不是查找每个天数的最小/最大天数month@Stefan这是一个很好的发现,但可能是它自己的答案。比下面我的答案短。不错!我认为arr.map&:to|date.chunk_,而{a,b|a==b.prev_day}更像这个问题。将连续天数分组,而不是查找每个天数的最小/最大天数month@Stefan这是一个很好的发现,但可能是它自己的答案。你可以使用minmax和destructure。对于dt | |,dt |,也可以使用minmax和destructure。同样适用于dt | |,dt |。所以您有Rails,但不使用Rails,非常酷。问题是Rails被标记了。你是否因为不使用Rails或其他东西而感到个人冒犯?如果愿意的话,可以使用Rails,交换出序号是很简单的。我刚刚创建了一个自给自足的示例,这有什么不对?所以你有Rails,但你不使用Rails,非常酷。问题是Rails被标记了。你是否因为不使用Rails或其他东西而感到个人冒犯?如果愿意的话,可以使用Rails,交换出序号是很简单的。我刚刚创建了一个自给自足的例子,这有什么错?
mon, arr = enum.next
  #=> ["02", ["2020-02-12", "2020-02-13", "2020-02-14"]]
arr
  .map(&:to_date)
  .group_by(&:month)
  .map do |_, dates|
    dates.minmax.map { |date| date.to_s(:long_ordinal) }.join(' - ')
  end
# ["January 5th, 2020 - January 9th, 2020", "February 12th, 2020 - February 14th, 2020"]