Perl日期时间处理模块之DateTime


此模块是Perl的DateTime项目的一部分,它提供了一个基类,用以“代表日期/时间的组合”。它是创建自定义日期(Date)对象的最方便的方法,并且包括了用于分析、格式化、计算持续时间和操控时区的模块。
一般来说,在需要本地化或者定义用于时间信息的自定义存储容器的时候,您要将这个模块用作创建与日期相关的新对。
DateTime-Adateandtimeobject
这应该是Perl下日期时间综合功能最好的非核心模块,它提供了众多的函数功能调用,来对日期及时间进行转换处理及格式化。除非特殊情况下,它都能很好地胜任工作。
示例
useDateTime;
$dt=DateTime->new(
year=>1984,
month=>10,
day=>16,
hour=>16,
minute=>12,
second=>47,
nanosecond=>500000000,
time_zone=>'Asia/Shanghai',
);
#从unix时间戳进行转换
$dt=DateTime->from_epoch(epoch=>$epoch);
$dt=DateTime->now;#sameas(epoch=>time())
$year=$dt->year;
$month=$dt->month;#1-12
$day=$dt->day;#1-31
$dow=$dt->day_of_week;#1-7(Mondayis1)
$hour=$dt->hour;#0-23
$minute=$dt->minute;#0-59
$second=$dt->second;#0-61(leapseconds!)
$doy=$dt->day_of_year;#1-366(leapyears)
$doq=$dt->day_of_quarter;#1..
$qtr=$dt->quarter;#1-4
#allofthestart-at-1methodsabovehavecorrespondingstart-at-0
#methods,suchas$dt->day_of_month_0,$dt->month_0andsoon
#返回不同格式的日期
$ymd=$dt->ymd;#2002-12-06
$ymd=$dt->ymd('/');#2002/12/06
$mdy=$dt->mdy;#12-06-2002
$mdy=$dt->mdy('/');#12/06/2002
$dmy=$dt->dmy;#06-12-2002
$dmy=$dt->dmy('/');#06/12/2002
$hms=$dt->hms;#14:02:29
$hms=$dt->hms('!');#14!02!29
$is_leap=$dt->is_leap_year;
#thesearelocalizable,seeLocalessection
$month_name=$dt->month_name;#January,February,...
$month_abbr=$dt->month_abbr;#Jan,Feb,...
$day_name=$dt->day_name;#Monday,Tuesday,...
$day_abbr=$dt->day_abbr;#Mon,Tue,...
#Maynotworkforallpossibledatetime,seethedocsonthis
#日期时间的计算
$epoch_time=$dt->epoch;
$dt2=$dt+$duration_object;
$dt3=$dt-$duration_object;
$duration_object=$dt-$dt2;
$dt->set(year=>1982);
#设置本地时区,这对运算非常重要
$dt->set_time_zone('Asia/Shanghai');
$dt->set_formatter($formatter);
由于自身的一些原因,它在密集运算调用时,性能一般,不及内置的localtime的处理效率。所以Perl官方选用Time::Piece做为其内置的日期时间处理模块,后者在功能使用上与前者几乎一样,但性能要高出很多。
鉴于此,出现了一个名为DateTime::Tiny模块,顾名思义,它是DateTime的精简版,其性能与Time::Piece相当,但相对功能少了许多。同时DateTime的原作者开发了一个很人性化的模块:DateTime::Locale,它能依据用户所声明的locale类型,自动输出相关语言的日期时间,当然也支持中文(DateTime::Locale::zh_CN)的了。示例如下:
use DateTime;
use feature qw(:5.10);
binmode(STDOUT,':encoding(utf8)');
my $dt = DateTime->now( locale => 'zh_CN' );
say $dt->month_name();
性能比较
#!/opt/perl/bin/perl
use strict;
use warnings;
use utf8;
use feature qw(:5.18);
use Benchmark qw/:all/;
use DateTime;
use DateTime::Tiny;
use Time::Piece;
say 'Create DATETIME object:';
cmpthese 0, {
'DateTime' => sub {
my $dt = DateTime->now();
},
'DateTime::Tiny' => sub {
my $dt = DateTime::Tiny->now();
},
'Time::Piece' => sub {
my $dt = Time::Piece->new();
}
};
say 'Create DATETIME object from string like ISO 8601:';
use DateTime::Format::Strptime;
my $datetime_str = "2013-03-01T12:00:00";
my $pattern = "%Y-%m-%dT%H:%M:%S";
cmpthese 0, {
'DateTime' => sub {
my $f = DateTime::Format::Strptime->new(pattern => $pattern);
my $dt = $f->parse_datetime($datetime_str);
},
'DateTime::Tiny' => sub {
my $dt = DateTime::Tiny->from_string($datetime_str);
},
'Time::Piece' => sub {
my $dt = Time::Piece->strptime($datetime_str, $pattern);
}
};
比较结果
Create DATETIME object:
Rate DateTime Time::Piece DateTime::Tiny
DateTime 14864/s -- -64% -78%
Time::Piece 41767/s 181% -- -38%
DateTime::Tiny 67650/s 355% 62% --
Create DATETIME object from string like ISO 8601:
Rate DateTime DateTime::Tiny Time::Piece
DateTime 2646/s -- -99% -99%
DateTime::Tiny 190648/s 7104% -- -1%
Time::Piece 192181/s 7162% 1% --
参考文档
DateTime
DateTime::Tiny
DateTime::Locale
Perl日期时间处理模块之Time::Piece
一般来说,在需要本地化或者定义用于时间信息的自定义存储容器的时候,您要将这个模块用作创建与日期相关的新对。
DateTime-Adateandtimeobject
这应该是Perl下日期时间综合功能最好的非核心模块,它提供了众多的函数功能调用,来对日期及时间进行转换处理及格式化。除非特殊情况下,它都能很好地胜任工作。
示例
useDateTime;
$dt=DateTime->new(
year=>1984,
month=>10,
day=>16,
hour=>16,
minute=>12,
second=>47,
nanosecond=>500000000,
time_zone=>'Asia/Shanghai',
);
#从unix时间戳进行转换
$dt=DateTime->from_epoch(epoch=>$epoch);
$dt=DateTime->now;#sameas(epoch=>time())
$year=$dt->year;
$month=$dt->month;#1-12
$day=$dt->day;#1-31
$dow=$dt->day_of_week;#1-7(Mondayis1)
$hour=$dt->hour;#0-23
$minute=$dt->minute;#0-59
$second=$dt->second;#0-61(leapseconds!)
$doy=$dt->day_of_year;#1-366(leapyears)
$doq=$dt->day_of_quarter;#1..
$qtr=$dt->quarter;#1-4
#allofthestart-at-1methodsabovehavecorrespondingstart-at-0
#methods,suchas$dt->day_of_month_0,$dt->month_0andsoon
#返回不同格式的日期
$ymd=$dt->ymd;#2002-12-06
$ymd=$dt->ymd('/');#2002/12/06
$mdy=$dt->mdy;#12-06-2002
$mdy=$dt->mdy('/');#12/06/2002
$dmy=$dt->dmy;#06-12-2002
$dmy=$dt->dmy('/');#06/12/2002
$hms=$dt->hms;#14:02:29
$hms=$dt->hms('!');#14!02!29
$is_leap=$dt->is_leap_year;
#thesearelocalizable,seeLocalessection
$month_name=$dt->month_name;#January,February,...
$month_abbr=$dt->month_abbr;#Jan,Feb,...
$day_name=$dt->day_name;#Monday,Tuesday,...
$day_abbr=$dt->day_abbr;#Mon,Tue,...
#Maynotworkforallpossibledatetime,seethedocsonthis
#日期时间的计算
$epoch_time=$dt->epoch;
$dt2=$dt+$duration_object;
$dt3=$dt-$duration_object;
$duration_object=$dt-$dt2;
$dt->set(year=>1982);
#设置本地时区,这对运算非常重要
$dt->set_time_zone('Asia/Shanghai');
$dt->set_formatter($formatter);
由于自身的一些原因,它在密集运算调用时,性能一般,不及内置的localtime的处理效率。所以Perl官方选用Time::Piece做为其内置的日期时间处理模块,后者在功能使用上与前者几乎一样,但性能要高出很多。
鉴于此,出现了一个名为DateTime::Tiny模块,顾名思义,它是DateTime的精简版,其性能与Time::Piece相当,但相对功能少了许多。同时DateTime的原作者开发了一个很人性化的模块:DateTime::Locale,它能依据用户所声明的locale类型,自动输出相关语言的日期时间,当然也支持中文(DateTime::Locale::zh_CN)的了。示例如下:
use DateTime;
use feature qw(:5.10);
binmode(STDOUT,':encoding(utf8)');
my $dt = DateTime->now( locale => 'zh_CN' );
say $dt->month_name();
性能比较
#!/opt/perl/bin/perl
use strict;
use warnings;
use utf8;
use feature qw(:5.18);
use Benchmark qw/:all/;
use DateTime;
use DateTime::Tiny;
use Time::Piece;
say 'Create DATETIME object:';
cmpthese 0, {
'DateTime' => sub {
my $dt = DateTime->now();
},
'DateTime::Tiny' => sub {
my $dt = DateTime::Tiny->now();
},
'Time::Piece' => sub {
my $dt = Time::Piece->new();
}
};
say 'Create DATETIME object from string like ISO 8601:';
use DateTime::Format::Strptime;
my $datetime_str = "2013-03-01T12:00:00";
my $pattern = "%Y-%m-%dT%H:%M:%S";
cmpthese 0, {
'DateTime' => sub {
my $f = DateTime::Format::Strptime->new(pattern => $pattern);
my $dt = $f->parse_datetime($datetime_str);
},
'DateTime::Tiny' => sub {
my $dt = DateTime::Tiny->from_string($datetime_str);
},
'Time::Piece' => sub {
my $dt = Time::Piece->strptime($datetime_str, $pattern);
}
};
比较结果
Create DATETIME object:
Rate DateTime Time::Piece DateTime::Tiny
DateTime 14864/s -- -64% -78%
Time::Piece 41767/s 181% -- -38%
DateTime::Tiny 67650/s 355% 62% --
Create DATETIME object from string like ISO 8601:
Rate DateTime DateTime::Tiny Time::Piece
DateTime 2646/s -- -99% -99%
DateTime::Tiny 190648/s 7104% -- -1%
Time::Piece 192181/s 7162% 1% --
参考文档
DateTime
DateTime::Tiny
DateTime::Locale
Perl日期时间处理模块之Time::Piece