在perl中转换iso 8601格式的systemdate

use*_*128 8 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";
Run Code Online (Sandbox Code Playgroud)

目前的输出是:

Time zone *******-> "-04:00"
Current date *******-> "2014-06-03T03:46:07-04:00"
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*t B 13

Perl的DateTime软件包(在CPAN上)可以很容易地为您生成ISO8601日期,但有一点需要注意.

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

use DateTime;
my $now = DateTime->now()->iso8601().'Z';
Run Code Online (Sandbox Code Playgroud)

  • @bart-b 你有没有参考 ISO8601 规范说应该假定 UTC?我只看到文档说如果 Z 丢失,则假定当地时间。 (3认同)
  • `DateTime-> now() - > format_cldr("yyyy-MM-dd'T'HH:mm:ssZ")`是一种更加动态(虽然详细)的附加偏移量的方法.在这种情况下,将附加"+00:00"而不是"Z",但这仍然足以满足ISO 8601的要求. (2认同)

cha*_*sen 7

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

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

输出:

2014-06-04T10:17:17Z
Run Code Online (Sandbox Code Playgroud)


Dav*_*oss 5

自2007年以来,Time :: PieceTime :: Second已作为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)
Run Code Online (Sandbox Code Playgroud)

  • @VectorGorgoth:我很清楚 Time::Piece 仍然是核心 Perl 的一部分。我不知道你为什么认为你需要提醒我。 (3认同)