我正在尝试从下面的哈希输出转换为某种日期格式。我需要将许多哈希输出转换为下面的日期格式。我现在使用下面的代码。看来这段代码不是我使用的正确方法。
请分享您的想法,以便从每个哈希输出中获取该时间格式
my $status_update_time = "$row->{'update_time'}";
$status_update_time =~ m/(\d{4})-(\d{2})-(\d{2})\ (\d{2}):(\d{2}):(\d{2})$/;
my ($year, $month, $date,$hours,$minute,$second) = ($1, $2, $3, $4, $5, $6);
my $date_time = "$1-$2-$3T$4:$5:$6TZ"; #2015-08-11T04:31:41Z# expecting this time output
my $next_check = "$row->{'next_check'}";
$next_check =~ m/(\d{4})-(\d{2})-(\d{2})\ (\d{2}):(\d{2}):(\d{2})$/;
my ($year, $month, $date,$hours,$minute,$second) = ($1, $2, $3, $4, $5, $6);
my $next_check_time = "$1-$2-$3T$4:$5:$6Z"; #2015-08-11T04:31:41Z# expecting this time output
由于
答案 0 :(得分:3)
使用Time::Piece。它是Perl发行版的标准部分。使用strptime
(字符串解析时间)将字符串解析为Time :: Piece对象。然后使用strftime
(字符串格式时间)以您想要的任何格式显示Time :: Piece对象。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Piece;
my $in_format = '%Y-%m-%d %H:%M:%S';
my $out_format = '%Y-%m-%dT%H:%M:%SZ';
my $in_date = '2015-08-18 08:51:00';
my $date = Time::Piece->strptime($in_date, $in_format);
say $date->strftime($out_format);
答案 1 :(得分:0)
您的时间戳几乎已经是正确的格式。只有两件或三件事没有。
$
,但在开头没有^
,所以也许时间戳字段以垃圾开头。如果是,则需要删除。如果没有,请忽略这一点。T
Z
你也在重复两次相同的模式。这表明你真的想要一个子程序,所以你只需要编写一次代码。
然后你要分配一堆你从未使用过的变量($year
,$month
,...)。如果这是一个包含大量迭代的循环,效率非常低。还会有一个警告说你重新声明了所有这些,因为你再次用my
几行向下声明它们。 use warnings
会告诉你这件事。
特别是如果它运行了很多次,那么滚动自己进行这种简单的替换比使用功能齐全的解析器要快。
use strict;
use warnings;
use feature 'say';
my $row = {
update_time => 'foo 2015-05-11 21:17:41',
next_check => '2015-05-12 09:17:41',
};
say format_custom_to_iso($row->{update_time});
say format_custom_to_iso($row->{next_check});
sub format_custom_to_iso {
my ($timestamp) = @_;
# remove non-digits from the front (maybe this can be omitted)
$timestamp =~ s/^[^0-9]+//;
# replace the space with a T in the middle
$timestamp =~ tr/ /T/;
# and add a Z in the end
return $timestamp . 'Z';
}
<强>输出:强>
2015-05-11T21:17:41Z
2015-05-12T09:17:41Z