如何显示日期按降序排列

时间:2015-03-30 13:25:19

标签: 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.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

但是,它似乎只是临时将其转换为整数,然后它会变回字符串。

任何帮助都很棒。

谢谢, 德文

4 个答案:

答案 0 :(得分:3)

require "date"

[
  "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",
]
.map{|s| Date.parse(s)}.each_cons(2).all?{|d1, d2| d1 >= d2}
# => true

答案 1 :(得分:0)

您可以使用sort_by

dates= ["06 May 14","11 Apr 14","11 Apr 14","11 Apr 14","10 Apr 14","09 Apr 14","09 Apr 14","08 Apr 14","08 Apr 14"]
dates.sort_by { |x| -Date.parse(x).to_time.to_i }
=> ["06 May 14", "11 Apr 14", "11 Apr 14", "11 Apr 14", "10 Apr 14", "09 Apr 14", "09 Apr 14", "08 Apr 14", "08 Apr 14"]

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

dates.sort_by { |x| -Date.parse(x).to_time.to_i } == dates
=> true

答案 2 :(得分:0)

  

但是,似乎只是暂时将其转换为整数

这是因为您没有用已分析的日期替换数组元素。你只是转换它们一次。

使用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"]

答案 3 :(得分:0)

排序需要永远,并创建一个临时数组。只需单步执行数组,将每个日期与之前的日期进行比较:

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

或者,您可以按如下方式编写convert

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"