将字符串日期格式从“17-Nov-2011”转换为“11/17/11”。

14

我有这段代码,将日期字符串数组从17-Nov-2011格式转换为11/17/11格式:

def date_convert dates
  months = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 
             'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 
             'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12 }
  new_dates = []
  dates.each do |date|
    date_split = date.split('-')
    month = months[date_split[1]] 
    day = date_split[0]
    year = date_split[2][-2, 2]
    new_dates.push ("#{month}/#{day}/#{year}")
  end
  new_dates
end

有没有更好的、可能是内置的方法来用Ruby进行这种转换?我正在学习Ruby,因此任何其他方法都将不胜感激。


2
Rubyзҡ„Dateе’ҢTimeеә“йқһеёёеҠҹиғҪйҪҗе…ЁгҖӮдёӨиҖ…йғҪеҖјеҫ—иҠұж—¶й—ҙдәҶи§Је®ғ们иғҪеҒҡд»Җд№ҲпјӣDateеӨ„зҗҶзҡ„иҢғеӣҙжҜ”TimeжӣҙеӨ§гҖӮ - the Tin Man
1
parse失败或混淆时,你应该明确查看DateTime.strptime - Phrogz
注意:空数组 + each + push = map - tokland
我将仔细研究DateTime,以及mapDateTime.strptime - Sean Lerner
3个回答

22
使用内置的Time.parseTime#strftime函数。
require 'time'
time = Time.parse("17-Nov-2011")
time.strftime("%m/%d/%y")
# => "11/17/11"

4
我会把.strftime()挂在解析之后,但这只是一个小差别。 - the Tin Man
使用 Time.parse... 返回:Time:Class 没有定义方法 'parse' (NoMethodError)。 - Sean Lerner
我没有!问题解决了。使用Time.parseDate.parse有什么区别/优势吗?(好像使用Date.parse时我不需要引用任何东西) - Sean Lerner
1
如果你只需要处理日期,Date.parse就足够了。然而,我记得旧版本的Ruby没有提供.parse.strftime。Ruby 1.9.2则提供了这些功能。 - Simone Carletti

10

使用Date#strftime,您可以格式化日期。 Date.strptime允许进行“反向”操作:从字符串构建日期。

当您组合两者时,即可获得您想要的结果:

puts Date.strptime('17-Nov-2011', '%d-%b-%Y').strftime('%m/%d/%y')

每个%参数都是日期字符串的一部分。 您需要:

用于解析日期字符串:

  • %d:日期中的天数(17)
  • %b:缩写月份(Nov)
  • %Y:四位年份(2011)

用于创建字符串:

  • %m:月份(11)
  • %d:日期中的天数(17)
  • %y:两位年份(11)

我知道Ruby可以猜测如何解析日期字符串,但我不知道你可以告诉它格式,这正是我所需要的。谢谢! - Nathan Long

5

Ruby有一套相当强大的日期和时间函数,可以查看Date类。

Date.parse("17-Nov-2011").strftime('%m/%d/%y')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接