Journal(2005) | Blog(2006) | RandomLink | WhoAmI | LiveBookmark | HomePage

<<Previous: role Example13 { # Perl6 }  >>Next: module updated

Class::Date 的两个常见用途

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

<<Previous: role Example13 { # Perl6 }  >>Next: module updated

Options: +Del.icio.us

Related items Created on 2005-06-01 15:02:47, Last modified on 2005-11-08 01:57:43
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet && Catalyst 5.62.