解析不同格式的日期字符串

时间:2017-02-15 20:39:12

标签: ruby datetime datetime-format

我正在编写一个帮助程序来解析我在CSV中给出的一些日期字符串。问题是它们的格式化方式不一致。有三种不同的格式:

  • “01021992”(%m%d%Y
  • “19920201”("%Y%m%d"
  • “PORSCHE”(或其他一些随机词)

以下是我编写的帮助我解析日期的函数。

class DateTimeParser
  require "date"
  require 'active_support/all'
  require 'byebug'

  class Object
    def blank?
      return self == nil || self == ""
    end
  end

  def parse_string_date
    date_str = "01021992"
    formats = ["%Y%m%d", "%m%d%Y"]
    date = nil

    formats.each do |form|
      begin
        date =  DateTime.parse(date_str, form)
        break
      rescue => e
        puts "ERROR: #{e}"
        puts "Failed for #{date_str} with format #{form}"
      end
    end

    #this should handle the case where the date is just a word (i.e. "PORSCHE")
    if date.nil?
      date = DateTime.parse("03141994", "%m%d%Y")
    end

    date = date.change(:offset => "+0500")
    puts "Date : #{date}"
  end

  DateTimeParser.new().parse_string_date
end

如果您想要运行此项并更改date_str

的值,则上面提供了可能的输入

输出:

ERROR: invalid date
Failed for 01021992 with format %Y%m%d
ERROR: invalid date
Failed for 01021992 with format %m%d%Y

我想我的麻烦是我似乎无法确定您可以传递给parse的正确格式。

1 个答案:

答案 0 :(得分:0)

为什么不建立一些模式和模板,而不是随机尝试,

format = FORMATS.find do |rx, _|
  rx.match(date_str)
end

format and DateTime.parse(date_str, format[1])

然后您可以尝试以这种方式解码:

MyFileAbsPath.swift:72: Test Case '-[Tests.DoThingTest testPerformance]' measured 
[Time, seconds] average: 0.096, relative standard deviation: 89.348%, values: 
[0.352850, 0.067076, 0.067139, 0.067347, 0.067608, 0.067030, 0.067298, 0.068089, 0.067496, 0.066790], 
performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, 
baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, 
maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100

您可以添加其他格式,以及放弃的“无论”条件,并按原样返回字符串。