Ruby中的DateTime字符串 - 如何使时间可选

时间:2014-03-18 13:09:17

标签: ruby datetime datetime-format

是否有办法解析格式为“DD / MM / YYYY HH:MM:SS”的时间戳字符串,而不循环使用多个日期格式字符串,以便时间可选。

一厢情愿的例子:

"01/01/2014"       -> 01/01/2014 00:00:00
"01/01/2014 10:00" -> 01/01/2014 10:00:00

试图使用DateTime.strptime("01/01/14 12:00", "%d/%m/%Y %H:%M:%S"),但显然是因为没有秒而出错。

2 个答案:

答案 0 :(得分:5)

您可以使用case..when构建和模式编写自定义方法,如下所示:

require 'time'
require 'date'

def parse_date_time(string)
  case string
  when /\d{2}\/\d{2}\/\d{4}/
    DateTime.strptime( string, "%d/%m/%Y" )
  when /\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2}/
    DateTime.strptime( string, "%d/%m/%Y %H:%M" )
  when /\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2}:\d{2}/
    DateTime.strptime( string, "%d/%m/%Y %H:%M:%S" )
  end
end

parse_date_time('01/01/2014 10:00:12')
# => #<DateTime: 2014-01-01T00:00:00+00:00 ((2456659j,0s,0n),+0s,2299161j)>

parse_date_time('12/07/2011')
# => #<DateTime: 2011-07-12T00:00:00+00:00 ((2455755j,0s,0n),+0s,2299161j)>

答案 1 :(得分:2)

假设您尝试解析的日期采用%d/%m/%Y %H:%M:%S格式,可能缺少小时,分钟或秒,DateTime.parse方法应执行以下操作:

require 'date'

DateTime.parse("01/01/2014").to_s
# => "2014-01-01T00:00:00+00:00"

DateTime.parse("01/01/2014 10:00").to_s
# => "2014-01-01T10:00:00+00:00"

DateTime.parse("01/01/2014 10:00:30").to_s
# => "2014-01-01T10:00:30+00:00"