Ruby 如何显示日期按降序排列

Ruby 如何显示日期按降序排列,ruby,Ruby,我有一个字符串格式的日期数组: [ 0] "06 May 14", [ 1] "11 Apr 14", [ 2] "11 Apr 14", [ 3] "11 Apr 14", [ 4] "10 Apr 14", [ 5] "09 Apr 14", [ 6] "09 Apr 14", [ 7] "09 Apr 14", [ 8] "09 Apr 14", [ 9] "08 Apr 14", [10] "08 Apr 14" 我需要找到一种证明日期在下降的方法 我曾尝试使用 datesarray.

我有一个字符串格式的日期数组:

[ 0] "06 May 14",
[ 1] "11 Apr 14",
[ 2] "11 Apr 14",
[ 3] "11 Apr 14",
[ 4] "10 Apr 14",
[ 5] "09 Apr 14",
[ 6] "09 Apr 14",
[ 7] "09 Apr 14",
[ 8] "09 Apr 14",
[ 9] "08 Apr 14",
[10] "08 Apr 14"
我需要找到一种证明日期在下降的方法

我曾尝试使用

datesarray.map { |s, i| [Date.parse(s).to_time.to_i, i] }
其中:

[ 0] [
    [0] 1399330800,
    [1] nil
],
[ 1] [
    [0] 1397170800,
    [1] nil
],
[ 2] [
    [0] 1397170800,
    [1] nil
],
[ 3] [
    [0] 1397170800,
    [1] nil
],
[ 4] [
    [0] 1397084400,
    [1] nil
],
[ 5] [
    [0] 1396998000,
    [1] nil
],
[ 6] [
    [0] 1396998000,
    [1] nil
],
[ 7] [
    [0] 1396998000,
    [1] nil
],
[ 8] [
    [0] 1396998000,
    [1] nil
],
[ 9] [
    [0] 1396911600,
    [1] nil
],
[10] [
    [0] 1396911600,
    [1] nil
然而,它似乎只是暂时将其转换为整数,然后又变回字符串

任何帮助都很好

谢谢, 德文郡

您可以使用:

要显示输入列表按日期降序排列,请将其与已排序数组进行比较:

dates.sort_by { |x| -Date.parse(x).to_time.to_i } == dates
=> true
但是,它似乎只是暂时将其转换为整数

这是因为您没有用解析的日期替换数组元素。您只需将其转换一次

使用
map也用于替换数组值。在这里:

datesarray = ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "08 Apr 14", "08 Apr 14"]
datesarray.map { |s, i| [Date.parse(s).to_time.to_i, i] }
datesarray
#  => ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "08 Apr 14", "08 Apr 14"] 

datesarray.map! { |s, i| [Date.parse(s).to_time.to_i, i] }
datesarray
# => [[1399314600, nil], [1397154600, nil], [1397154600, nil], [1397154600, nil], [1397068200, nil], [1396981800, nil], [1396981800, nil], [1396981800, nil], [1396981800, nil], [1396895400, nil], [1396895400, nil]] 
排序数组:

datesarray.sort_by(&:to_time) # String#to_time works only with Rails
# => ["08 Apr 14", "08 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "10 Apr 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "06 May 14"]
datesarray.sort_by(&:to_time).reverse # String#to_time works only with Rails
# => ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "08 Apr 14", "08 Apr 14"]
反向排序:

datesarray.sort_by(&:to_time) # String#to_time works only with Rails
# => ["08 Apr 14", "08 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "10 Apr 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "06 May 14"]
datesarray.sort_by(&:to_time).reverse # String#to_time works only with Rails
# => ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14", "08 Apr 14", "08 Apr 14"]

排序会花费很长时间并创建一个临时数组。只需单步遍历数组,将每个日期与之前的日期进行比较:

require 'date'

def descending?(arr)
  last = convert(arr.first)
  arr.all? do |s|
    l = last
    last = convert(s)
    last <= l
  end
end

def convert(s)
  Date.strptime(s, '%d %b %y')
end

arr = ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14",
       "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14",
       "09 Apr 14", "08 Apr 14", "08 Apr 14"]

descending?(arr)
  #=> true

arr[0], arr[1] = arr[1], arr[0]
arr
  #=> ["11 Apr 14", "06 May 14", "11 Apr 14", "11 Apr 14",
  #    "10 Apr 14", "09 Apr 14", "09 Apr 14", "09 Apr 14",
  #    "09 Apr 14", "08 Apr 14", "08 Apr 14"]

descending?(arr)
  #=> false

您所说的“仅暂时将其转换为整数”是什么意思?您希望结果是一个整数列表吗?注意:to_time是rails对字符串的修补程序。
dates.sort_by{s|Date.parse s}==dates.reverse
就足够了吗?
MON_MAP =
  { 'Jan'=>'00', 'Feb'=>'01', 'Mar'=>'02', 'Apr'=>'03', 'May'=>'04', 'Jun'=>'05',
    'Jul'=>'06', 'Aug'=>'07', 'Sep'=>'08', 'Oct'=>'09', 'Nov'=>'10', 'Dec'=>'11' }

def convert(s)
  "#{ s[-2,2] } #{ MON_MAP[s[3,3]] } #{ s[0,2] }"
end

convert("11 Apr 14")
  #=> "14 03 11"