我有一个字符串格式的日期数组:
[ 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
但是,它似乎只是临时将其转换为整数,然后它会变回字符串。
任何帮助都很棒。
谢谢, 德文
答案 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"