考虑在Windows 7系统上运行以下代码:
% info patchlevel
8.6.4
% clock scan "1995-01-35" -format "%Y-%m-%d"
791856000
% clock format [clock scan "1995-01-35" -format "%Y-%m-%d"] -format "%Y-%m-%d"
1995-02-04
%
我在尝试确定字符串是否为有效日期时遇到了这种情况,我期待第一次时钟扫描失败,因为35不是有效日期,但会发生的事情是我在35天之后得到一个日期一月一日。
在我的代码中,我现在将第二个时钟命令的输出与原始输入进行比较,如果结果不同,则判断该字符串实际上不是有效日期。
是否有更好的方法来验证日期,这是时钟命令的预期行为,我在时钟的手册页中找不到它?
答案 0 :(得分:4)
Tcl
中没有内置功能。如果日期/月份超过,则将其添加到连续的日期/月份。
在您的情况下,您将在1月份的第35个月给出。额外的4天(即31 + 4 = 35)被添加并计算为2月的第4天。
在奇怪的情况下,添加给定天数会产生日期 这是不存在的,因为它属于下降的天数 Julian-to-Gregorian转换,日期转换为就像它一样 儒略历。
添加若干个月或若干年,情况类似;它 将给定时间转换为日历日期和时间。然后呢 增加必要的月数或年数,并重新转换 结果日期和时间到绝对时间。
如果由于月份太少而无法生成日期 (例如,在1月31日加1个月时),最后一天 月代替。因此,将在1月31日之后增加1个月 2月28日的共同年份或2月29日的闰年。
proc is_valid_date {date {date_format "%Y-%m-%d"}} {
return [string equal [clock format [clock scan $date -format $date_format] -format $date_format] $date]
}
日期格式是可选的,默认为%Y-%m-%d
。如果格式不匹配则会失败。您可以处理例外情况。
输出
% is_valid_date "1995-02-28"
1
% is_valid_date "1995-01-35"
0
%
我们将日期转换为较长日期并再次恢复为日期。如果两者不相同,则给定输入不正确。
参考: clock