如何使用 Perl 将未知 date/time 格式转换为正常格式?
How to convert unknown date/time format into normal using Perl?
我有一个像这样的 date/time:2015-07-31T13:30:00.000+01:00
我想使用 Perl 和 Time::Piece->strptime
将其转换为正常的日期和时间
这是我的代码:
sub changeDateFormat {
my ($date, $fromFormat, $toFormat) = (@_);
return Time::Piece->strptime($date, $fromFormat)->strftime($toFormat);
}
来电:
print changeDateFormat($that_date, '%Y-%m-%dT%H:%M:%S.%N+%z', '%Y:%m:%d');
我认为 .000 是纳秒,+01.00 代表时区。
但是给定的代码给出了这个:
解析时间错误 /usr/lib64/perl5/Time/Piece.pm 第 470 行
感谢任何帮助。
我认为有几个问题。
%N
不在我的 strftime
联机帮助页中。所以这可能行不通。
和 %z
- 我很确定 +01:00
无效。
%z The +hhmm or -hhmm numeric timezone (that is, the hour and
minute offset from UTC). (SU)
这虽然有效:
my $date = '2015-07-31T13:30:00+0100';
my $fromFormat = '%Y-%m-%dT%H:%M:%S%z';
print Time::Piece->strptime($date, $fromFormat);
所以我建议 - 除非你的毫秒数很重要 - 你可以通过正则表达式去除它们,同样地,时区。 (而且它们很重要,我不认为 Time::Piece
无论如何都会进行 ms 分辨率)
如果您愿意,可以使用正则表达式 'correct' 输入日期。我不确定是否适合您的用例但是:
$date =~ s/\+(\d{2}):(\d{2})$/+/;
$date =~ s/\.\d{3}+/+/;
您可以在 Time::Piece
中使用 strptime
并手动添加时区,如 this answer, or you could try using DateTime::Format::Strptime
所示:
use feature qw(say);
use strict;
use warnings;
use DateTime::Format::Strptime;
my $timestamp = '2015-07-31T13:30:00.000+0100';
my $strp = DateTime::Format::Strptime->new(
pattern => '%Y-%m-%dT%H:%M:%S.%N%z'
);
my $dt = $strp->parse_datetime( $timestamp );
say $dt->strftime('%Y:%m:%d');
输出:
2015:07:31
use DateTime;
use DateTime::Format::ISO8601;
use DateTime::Format::Strptime;
my $string = '2015-07-31T13:30:00.000+01:00';
my $date = DateTime::Format::ISO8601->parse_datetime( $string );
die "Error" unless $date;
my $formatter = new DateTime::Format::Strptime(pattern => '%Y-%m-%d %T');
$date->set_formatter($formatter);
print "$date\n";
我有一个像这样的 date/time:2015-07-31T13:30:00.000+01:00 我想使用 Perl 和 Time::Piece->strptime
将其转换为正常的日期和时间这是我的代码:
sub changeDateFormat {
my ($date, $fromFormat, $toFormat) = (@_);
return Time::Piece->strptime($date, $fromFormat)->strftime($toFormat);
}
来电:
print changeDateFormat($that_date, '%Y-%m-%dT%H:%M:%S.%N+%z', '%Y:%m:%d');
我认为 .000 是纳秒,+01.00 代表时区。 但是给定的代码给出了这个: 解析时间错误 /usr/lib64/perl5/Time/Piece.pm 第 470 行
感谢任何帮助。
我认为有几个问题。
%N
不在我的 strftime
联机帮助页中。所以这可能行不通。
和 %z
- 我很确定 +01:00
无效。
%z The +hhmm or -hhmm numeric timezone (that is, the hour and minute offset from UTC). (SU)
这虽然有效:
my $date = '2015-07-31T13:30:00+0100';
my $fromFormat = '%Y-%m-%dT%H:%M:%S%z';
print Time::Piece->strptime($date, $fromFormat);
所以我建议 - 除非你的毫秒数很重要 - 你可以通过正则表达式去除它们,同样地,时区。 (而且它们很重要,我不认为 Time::Piece
无论如何都会进行 ms 分辨率)
如果您愿意,可以使用正则表达式 'correct' 输入日期。我不确定是否适合您的用例但是:
$date =~ s/\+(\d{2}):(\d{2})$/+/;
$date =~ s/\.\d{3}+/+/;
您可以在 Time::Piece
中使用 strptime
并手动添加时区,如 this answer, or you could try using DateTime::Format::Strptime
所示:
use feature qw(say);
use strict;
use warnings;
use DateTime::Format::Strptime;
my $timestamp = '2015-07-31T13:30:00.000+0100';
my $strp = DateTime::Format::Strptime->new(
pattern => '%Y-%m-%dT%H:%M:%S.%N%z'
);
my $dt = $strp->parse_datetime( $timestamp );
say $dt->strftime('%Y:%m:%d');
输出:
2015:07:31
use DateTime;
use DateTime::Format::ISO8601;
use DateTime::Format::Strptime;
my $string = '2015-07-31T13:30:00.000+01:00';
my $date = DateTime::Format::ISO8601->parse_datetime( $string );
die "Error" unless $date;
my $formatter = new DateTime::Format::Strptime(pattern => '%Y-%m-%d %T');
$date->set_formatter($formatter);
print "$date\n";