如何调整Ruby日期验证代码,仅保留Unix纪元及之后的有效日期
如何让Ruby日期验证只接受Unix纪元及之后的有效日期?
问题描述
我正尝试完成一项看似基础的任务却遭遇困难:需要判断日期是否有效,若有效则解析并格式化为指定字符串,否则返回‘bad date’。目前我的代码如下:
require 'date' date_last_printed = current_item.getProperties['Last Printed'] begin d = DateTime.parse(date_last_printed.to_s) if Date.valid_date?(d.year, d.month, d.day) d.strftime("%d/%m/%Y %H:%M:%S") else 'bad date' end rescue Exception => ex ex.message end
但发现01/01/1601被判定为有效日期,请问如何调整这段代码,使其仅返回Unix纪元起始时间及之后的有效日期?
解决方案
要解决这个问题,你需要在现有日期有效性验证的基础上,添加时间范围检查——确保解析后的日期不早于Unix纪元的起始点(即1970年1月1日00:00:00 UTC)。
具体调整步骤如下:
- 定义Unix纪元的基准时间:明确Unix时间的起始点为
DateTime.new(1970, 1, 1, 0, 0, 0, 0)(最后一个0代表UTC时区)。 - 添加范围判断:在验证日期格式有效性后,额外检查解析后的日期是否大于等于这个基准时间。
- 修正异常处理逻辑:原来的代码会返回异常消息,这不符合你返回
'bad date'的需求,所以需要把rescue块的返回值改为'bad date'。
调整后的完整代码如下:
require 'date' date_last_printed = current_item.getProperties['Last Printed'] begin d = DateTime.parse(date_last_printed.to_s) # 定义Unix纪元起始时间(UTC) unix_epoch = DateTime.new(1970, 1, 1, 0, 0, 0, 0) # 同时验证日期有效性和时间范围 if Date.valid_date?(d.year, d.month, d.day) && d >= unix_epoch d.strftime("%d/%m/%Y %H:%M:%S") else 'bad date' end rescue # 解析失败时直接返回bad date 'bad date' end
关键说明
- 时区注意事项:如果你处理的日期是本地时区而非UTC,可能需要调整
unix_epoch的时区参数(比如用DateTime.now.offset获取本地时区偏移),确保比较的一致性。 - Date.valid_date?的作用:这个方法仅验证日期是否为真实存在的日历日期(比如排除2月30日这种无效日期),但不限制时间范围,所以必须结合范围判断才能达到你的需求。
- 异常处理简化:直接rescue所有解析异常并返回
'bad date',符合你对无效日期统一返回指定字符串的要求。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

