将字符串转换为日期时间MMM DD YYYY HH:MMAM到YYYY-MM-DD HH:MM:SS

时间:2016-07-21 16:54:11

标签: perl datetime

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岁。

2 个答案:

答案 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