【发布时间】:2017-04-11 21:47:17
【问题描述】:
我正在处理一个 sftp 导入错误,在该错误中我试图标记任何不正确的导入日期。有两种类型的日期可以取消。第一个是年份在未来或过去的时候;第二个是当实际月份和天数太高时。 (例如,13/20/1995 或 11/35/2000)
我正在使用strptime 并且对于关闭的日期,标记它们并将它们显示为特定消息。我遇到的问题是,使用我使用的strptime 格式,错误发生在我输入错误消息之前。
table_birth_dates = self.class.connection.execute("SELECT birth_date FROM #{temp_table_name}").values.flatten
table_birth_dates.map! do |date|
birth_date = Date.strptime(date, '%m/%d/%Y')
if birth_date.nil?
month_day_error_message = 'Invalid Month/Day'
elsif birth_date > Time.zone.today
future_error_message = 'Year in Future'
elsif birth_date.year < 1900
past_error_message = 'Year too old'
else
birth_date
end
end
错误发生在birth_date = Date.strptime(date, '%m/%d/%Y')
对于诸如10/3/1891, 之类的日期,它将显示为Sat, 03 Oct 1891.
但是,对于诸如33/33/2000 之类的混乱日期,它向我显示了一个错误(这是有道理的),但是我希望在我的条件下修复此错误。
有人知道我能做什么吗?
【问题讨论】:
-
可以看看
Date::valid_date?。 -
最简单的方法是挽救异常。在线救援将是
require 'date'; birth_date = Date.strptime(date, '%m/%d/%Y') rescue nil,如果date不代表有效日期,则将birth_date设置为nil。您可以按照@orde 的建议使用Date::valid_date?,但要这样做,您需要解析出年、月和日:month, day, year = "11/35/2000".scan(/\d+(?=\/|\z)/).map(&:to_i) #=> [4, 35, 2000]; Date.valid_date?(year, month, day) #=> false。 (在正则表达式中,(?=\/|\z)是一个积极的前瞻。正则表达式只需/\d+/就足够了。) -
嘿,谢谢@CarySwoveland 非常有用且简单的解决问题的方法。