perl不同的时间格式输出

时间:2015-08-18 04:13:34

标签: perl

我正在尝试从下面的哈希输出转换为某种日期格式。我需要将许多哈希输出转换为下面的日期格式。我现在使用下面的代码。看来这段代码不是我使用的正确方法。

请分享您的想法,以便从每个哈希输出中获取该时间格式

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

由于

2 个答案:

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