Category: Modules Keywords: Class::Date
题外话
昨天 chunzi 给我传了他改进的对身份证验证的模块,加进了地区信息和真正的生日验证等。Thanks, 非常棒。他的代码我放到这了:IdentityCard.pm, 迟点我会对 Business::CN::IdentityCard 进行更新。(最近有三门考试 + 两门作业,有点忙)
不打算讲 Class::Date 的所有用途,详细的自行参考 perldoc Class::Date
用途一:验证日期正确与否
chunzi 在模块里使用了 Class::Date 来验证所输入身份证日期的正确性,写起来非常简单。类似的代码如下:use Class::Date qw/:errors date/;
my $date = date '1981-02-29';
if ($date->error) { die $date->errstr; }
# 因为这伪造的日期是错误的,所以我们可以捕获得到 Range check on date or time failed
->error 有好几种类型,这里的值为 E_RANGE, 属于范围超出。
用途二:日期加减
Eplanet 有个功能为最近四天发表的后标记 New, 最近两天修改的后标记 Update.这个功能很多地方都用得着。用 Class::Date 写这个判断非常简单。
use Class::Date qw/:errors date now/;
my $date = now; # now $date is '2005-06-01 15:00:52'
my $post_time = '2005-05-31 12:12:00';
if ($date - '4D' < $post_time) {
print 'new';
}
非常简单。我们还有年月小时等都可以做这个加减。如果不用 Class::Date 的话要先将 $post_time 转为 1970 年到现在的秒,然后通过现在的相减小于两天的秒。比起这个复杂多了。 CPAN 的意义在于大家分享自己的劳动成果。(如果某个问题很普遍,去 CPAN 上找一定可以找到解决方案。)
Attention
Class::Date 似乎在 Win2k 下不支持 1970 年前的日子。比如:use Class::Date qw/:errors date/; my $date = date '1969-01-01'; print $date->errstr; # Range check on date or time failed提示范围超出。后来我试了下 Date::Simple 似乎可以。
use Date::Simple;
my $date = Date::Simple->new('1949-02-28');
if ($date) { print 'OK' } else { print 'UOK'; }
Enjoy
Now, have a try. Thanks chunzi again. :)