我喜欢Time::Piece 只是因为它是 Perl 自带的,我相信是 5.10 版。您会发现数十个日期/时间模块,每个人都有自己的最爱,但随着 Time::Piece 成为官方发行版的一部分,是时候切换到它了。
要使用 Time::Piece,您需要了解 strptime (STRing Parse TIME) 和 strftime (STRing Format TIME) 两者都使用%x 字母格式来表示时间字符串的某些方面。原因是Time::Piece 使用相同的%x 格式字符来将您的时间字符串转换为时间对象,有时还会将该时间对象 格式化为您的字符串。
来自strftime 的手册页:
%j
以十进制数表示的一年中的日期(范围为 001 到 366)。
还有:
%y
没有世纪的十进制数字形式的年份(范围 00 到 99)。
现在转换您的日期:
use Time::Piece;
my $old_time = "12212"; #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); Now in YY/MM/DD format
哎呀
等等——strptime 不能理解 %j。这将给出错误的答案。
我没有对此进行测试,因为我经常使用 Time::Piece,以至于我可以在睡梦中进行。我之前从未在Time::Piece 中使用过%j。 perldoc 没有提到 %j 不起作用,我也没有收到任何错误。这不好。
新策略。我可以将YYddd 字符串解析为年和日。然后,我可以将一年的开始设为01/01/$year。在那之后,我可以把天数加到年里。但是,要正确执行此操作,我需要来自 Time::Seconds 的常量:
use strict;
use warnings;
use feature qw(say);
use Time::Piece;
use Time::Seconds;
my $old_date = "12212";
$old_date =~ /(..)(.*)/;
my $year = $1;
my $days = $2;
my $time = Time::Piece->strptime("01/01/$year", "%m/%d/%y");
$time += ( ( $days - 1 ) * ONE_DAY); #01/01/$year is day 1 and not 0
say $time->strftime("%y/%m/%d");
这给出了12/07/30 作为答案。
公告
Time::Piece 模块的所有者修复了模块中的错误。 1.23 版现在可以使用:
use warnings;
use strict;
use autodie;
use feature qw(say);
use Data::Dumper;
use Time::Piece;
my $old_time = "12212"; #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); #Now in YY/MM/DD format
say "Version: $Time::Piece::VERSION";
say $new_time;
打印出来:
Version: 1.23
2012/07/30