Feb 2 2016 12:00AM
Feb 15 2015 05:00PM
想将上述数据转换为' YYYY-MM-DD TT:TT:TT'格式,理想情况下:
2016-02-02 00:00:00
这是我尝试使用替换来转换它的内容。我有两个不同的原因是因为当我将数据BCP输出到文本文件中时,带有一位数的日期在它前面使用空格而不是0:
s/Feb (\d{1}) (\d{4}) (\d{2})(\:\d{2})AM/2-$1-2 $3$4/g;
s/Feb (\d{2}) (\d{4}) (\d{2})(\:\d{2})AM/2-$1-2 $3$4/g;
此外,我不确定如何将时间转换为军事时间,并且还有一种更有效的方式来完成所有12个月,而不是有12行代替所有这些,在这种情况下会有24岁。
答案 0 :(得分:4)
有些人更喜欢Time :: Piece,因为它与Perl捆绑在一起,但是这些模块很容易出错。我强烈建议使用不会混淆专家的模块,例如DateTime。
use strict;
use warnings qw( all );
use feature qw( say );
use DateTime::Format::Strptime qw( );
my $format = DateTime::Format::Strptime->new(
pattern => '%b %d %Y %I:%M%p',
#time_zone => 'local',
on_error => 'croak',
);
for ('Feb 2 2016 12:00AM', 'Feb 15 2015 05:00PM') {
say $format->parse_datetime($_)->strftime('%Y-%m-%d %H:%M:%S');
}
输出:
2016-02-02 00:00:00
2015-02-15 17:00:00
答案 1 :(得分:3)
Time::Piece
模块对这类事情很方便
strptime
类方法采用日期时间字符串和格式规范,用于解析字符串以创建新对象。同时,strftime
方法将根据另一种格式规范
use strict;
use warnings 'all';
use Time::Piece ();
while ( <DATA> ) {
chomp;
my $new_dt = Time::Piece->strptime($_, '%b %d %Y %H:%M%p')->strftime('%Y-%m-%d %H:%M:%S');
printf "%s --> %s\n", $_, $new_dt;
}
__DATA__
Feb 2 2016 12:00AM
Feb 15 2015 05:00PM
Feb 2 2016 12:00AM --> 2016-02-02 00:00:00
Feb 15 2015 05:00PM --> 2015-02-15 17:00:00