【问题标题】:How to test specific dates that cannot be parsed如何测试无法解析的特定日期
【发布时间】:2017-09-05 20:17:19
【问题描述】:

我需要测试一个特定的日期数组以确保它们的格式正确,但是我不能使用“解析”,因为如果我这样做了,那么不正确的日期就会被整理出来。例如,如果我的日期不正确,月份为“13”,它会增加另一年并将月份设置为 1。

我的代码从 SQL 查询中提取日期:

table_birth_dates = self.class.connection.execute("SELECT birth_date FROM #{temp_table_name}").values.flatten 

[
    [0] "1980-30-54",
    [1] "1980-30-54",
    [2] "2020-09-10",
    [3] "1890-10-30"
]
yr = 1900  
year_test = table_birth_dates.select{|d| Date.parse(d).year < yr}

现在给我一个ArgumentError: invalid date

我想过使用:

splitted_birth_date = table_birth_dates.first.split("-")
splitted_birth_date.first.to_i > 1900?

但如果我尝试遍历所有日期,我将无法通过拆分操作任何内容:

table_birth_dates.each do |birth_date|
  birth_date.split("-")
end

我能用这个做什么?

【问题讨论】:

    标签: ruby-on-rails ruby date


    【解决方案1】:

    我需要测试一个特定的日期数组以确保它们在 正确的格式...

    如果您收到错误,则表示日期不正确,您可以挽救该错误并对该日期执行任何您想要的操作以使其有效或其他任何事情。

    table_birth_dates.each do |birth_date|
      begin
        if Date.parse(d).year < yr
          # do smth
        end
      rescue ArgumentError => e
       # do smth with `d`
      end
    end
    

    【讨论】:

    • “如果您收到错误,则表示日期不正确”。不必要。这也可能意味着日期解析器选择了错误的格式。有很多模棱两可的日期似乎是正确的格式,但值不合适。这就是我们不使用parse 的原因,除非我们确定每个日期都对它有意义。如果我们不能保证,那么我们必须使用其他测试来尝试确定格式,并拒绝任何我们无法确定的日期。 parse 很方便,但它也很慢而且并不总是正确的,并且让它默默地返回一个无效的解析日期很难跟踪。
    • @theTinMan 我明白了。根据正则表达式测试每个日期然后用它做任何他们想做的事情会更聪明吗?例如:(?&lt;year&gt;\d{4})-(?&lt;month&gt;\d{2})-(?&lt;day&gt;\d{2}) 或者只是使用 #split 就像他们试图...
    • 这两种方法都无法告诉您一个字段是一个月还是一天。您可以相当安全地假设年、月、日格式的日期将是可解析的,但分隔符可能会有所不同。而且,不幸的是,互联网上充斥着忽略或不了解日期标准的“程序员”,因此您必须防御性地检查来源。如果您可以信任他们,您可以编写更宽松的代码。如果你不能那么防御并期待在你没有预见到的情况下会失败。您可以重新扫描日期以查找异常值以确定合适的...
    • ...但如果该特定提要没有任何明确的日期,那么您的代码仍然不会知道。有时您只是无法确定,不得不戴上侦探帽,了解更多有关来源的信息。请参阅en.wikipedia.org/wiki/… 了解更多信息。 stackoverflow.com/q/2955830/128421 也是一本好书。
    【解决方案2】:

    您可以将您的 selectsplit 方法组合在一起:

    table_birth_dates.select { |d| d.split('-').first.to_i < 1900 }
    #=> ["1890-10-30"]
    

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多