使用clock命令验证日期

时间:2016-07-05 11:59:30

标签: tcl

考虑在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天之后得到一个日期一月一日。

在我的代码中,我现在将第二个时钟命令的输出与原始输入进行比较,如果结果不同,则判断该字符串实际上不是有效日期。

是否有更好的方法来验证日期,这是时钟命令的预期行为,我在时钟的手册页中找不到它?

1 个答案:

答案 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

相关问题