01 June 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

题外话

昨天 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. :)



blog comments powered by Disqus