2017-04-10 34 views
0

我需要測試一個特定的日期數組以確保它們的格式正確,但是我不能使用'parse',因爲如果我這樣做的話,錯誤的日期是挑出來。舉例來說,如果我有一個不正確的日期與月「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 

我能做些什麼有了這個?

回答

0

我需要測試日期的特定陣列,以確保他們在 正確的格式...

如果你得到它意味着該日期不正確的錯誤,你能救該錯誤,並做任何你想要的日期,使其有效或任何。

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 
+0

「如果你得到一個錯誤,這意味着該日期不正確」。不必要。它也可能意味着日期解析器選擇了錯誤的格式。有很多不明確的日期似乎是正確的格式,但價值觀不適合。這就是爲什麼我們不使用'parse',除非我們確定每個日期都會對它有意義。如果我們無法保證,那麼我們必須使用其他測試來確定格式,並拒絕我們無法弄清的任何日期。 'parse'很方便,但它也很慢並且不總是正確,並且它無聲地返回一個無效的解析日期很難跟蹤。 –

+0

@theTinMan我看到了。根據正則表達式對每個日期進行測試,然後對它做任何他們想做的事情會更聰明嗎?例如:'(? \ d {4}) - (? \ d {2}) - (? \ d {2})'或者只是使用'#split'就像他們試圖...... – DiodonHystrix

+0

Neither方法能夠告訴你一個字段是一個月還是一天。您可以相當安全地假定年,月,日格式的日期將被解析,但分隔符可能會有所不同。不幸的是,互聯網充滿了「程序員」,他們忽視或不知道日期標準,所以你必須防禦性地檢查源代碼。如果你可以信任它們,你可以編寫更寬鬆的代碼。如果你不能防守,並期望在你沒有預見的情況下失敗。您可以重新掃描尋找異常值的日期以確定正確的配合... –

0

你可以結合你selectsplit接近在一起:

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