我需要測試一個特定的日期數組以確保它們的格式正確,但是我不能使用'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
我能做些什麼有了這個?
「如果你得到一個錯誤,這意味着該日期不正確」。不必要。它也可能意味着日期解析器選擇了錯誤的格式。有很多不明確的日期似乎是正確的格式,但價值觀不適合。這就是爲什麼我們不使用'parse',除非我們確定每個日期都會對它有意義。如果我們無法保證,那麼我們必須使用其他測試來確定格式,並拒絕我們無法弄清的任何日期。 'parse'很方便,但它也很慢並且不總是正確,並且它無聲地返回一個無效的解析日期很難跟蹤。 –
@theTinMan我看到了。根據正則表達式對每個日期進行測試,然後對它做任何他們想做的事情會更聰明嗎?例如:'(? \ d {4}) - (? \ d {2}) - (? \ d {2})'或者只是使用'#split'就像他們試圖...... –
DiodonHystrix
Neither方法能夠告訴你一個字段是一個月還是一天。您可以相當安全地假定年,月,日格式的日期將被解析,但分隔符可能會有所不同。不幸的是,互聯網充滿了「程序員」,他們忽視或不知道日期標準,所以你必須防禦性地檢查源代碼。如果你可以信任它們,你可以編寫更寬鬆的代碼。如果你不能防守,並期望在你沒有預見的情況下失敗。您可以重新掃描尋找異常值的日期以確定正確的配合... –