在perl中以iso 8601格式转换系统日期

时间:2014-06-03 07:47:50

标签: perl iso8601

我希望将系统日期转换为ISO 8601格式。 代码:

my $now = time();
my $tz = strftime("%z", localtime($now));
$tz =~ s/(\d{2})(\d{2})/$1:$2/;
print "Time zone *******-> \"$tz\"\n";
# ISO8601
my $currentDate =  strftime("%Y-%m-%dT%H:%M:%S", localtime($now)) . $tz;
print "Current date *******-> \"$currentDate\"\n";

当前输出为:

Time zone *******-> "-04:00"
Current date *******-> "2014-06-03T03:46:07-04:00"

我希望当前日期格式为" 2014-07-02T10:48:07.124Z",以便我可以计算两者之间的差异。

4 个答案:

答案 0 :(得分:11)

Perl的DateTime包(on CPAN)可以非常轻松地为您生成ISO8601日期,但有一点需要注意。

DateTime返回的字符串将采用UTC格式,但没有时区说明符。这应该没问题,因为根据ISO8601规范,如果没有指定时区,则应假定为UTC。但是,并非所有解析器都完全遵守规范。为了使我的日期更加健壮,我在Z的字符串末尾追加DateTime,所以这是我推荐的代码:

use DateTime;
my $now = DateTime->now()->iso8601().'Z';

答案 1 :(得分:4)

自2007年以来,

Time::PieceTime::Seconds已被列为Perl的标准组成部分。

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Piece;

my $time = localtime;
say $time->datetime; # Time in ISO8601 format
say $time->tzoffset; # Time zone offset in seconds

# But tzoffset actually returns a Time::Seconds object
say $time->tzoffset->hours; # Time zone offset in hours (for example)

答案 2 :(得分:4)

您应该使用gmtime()代替localtime()来获取UTC中的细分时间值。

use POSIX qw(strftime);
my $now = time();
print strftime('%Y-%m-%dT%H:%M:%SZ', gmtime($now)), "\n";

输出:

2014-06-04T10:17:17Z

答案 3 :(得分:0)

这仅使用标准包:

#! /usr/bin/perl
use POSIX qw(strftime);
use Time::HiRes qw/gettimeofday/;
  
sub iso8601
{
  my ($s, $f) = split (/\./, gettimeofday);
  strftime ('%Y-%m-%dT%H:%M:%S.'.$f.'%z', localtime ($s))
}

print iso8601, "\n";