我喜欢Time::Piece仅仅是因为它带有 Perl,因为我相信 5.10 版。你会发现几十个日期/时间模块,每个人都有自己的最爱,但随着Time::Piece
成为官方发行版的一部分,是时候切换到它了。
要使用 Time::Piece,您需要了解strptime ( STR ing P ass TIME ) 和strftime ( STR ing F格式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,以至于我可以在睡梦中做到这一点。我以前从未%j
在Time::Piece
. 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