2013-10-22 68 views
0

我已經做了一些搜索,我不知道如何使用核心Perl模塊正確地轉換它。我有2013-10-22T19:31:00Z,想要獲得10/22/2013和美國中部時間。如何正確轉換日期時間和時區?

+0

對於使用核心模塊轉換日期/時間格式,請參閱[此SO問題](http://stackoverflow.com/questions/17037539/perl-convert-date-timezone-without-datetime-module)等。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlack不,沒有足夠的信息來回答他在這個問題的答案中的問題。 – ikegami

+0

@ikegami然而,有一個鏈接到Time :: Piece的文檔,這將是一個好的開始。 – ThisSuitIsBlackNot

回答

2

標準Perl模塊?

這將包括從5.10開始已經成爲Perl的一部分的Time::Piece

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 
use Time::Piece; 

my $date = "2013-10-22T19:31:00Z"; 

my $time = Time::Piece->strptime ($date, "%Y-%m-%dT%H:%M:%SZ"); 
$time = localtime($time); # Converts time to local time 

say $time->mdy("/"); 

此打印出:

10/22/2013 

那古怪"%Y-%m-%dT%H:%M:%SZ"字符串代表你的時間輸入格式。您可以在strftime的管理中找到它。

  • %Y:四位數表示的年份
  • %m:月從01 - 12
  • %d:日從01 - 31
  • %H:小時,從00 - 23
  • %M:從00分鐘 - 59
  • %S:第二個從00到59
+1

這不會轉換爲中央時間 – ikegami

+0

我已經添加了一個'localtime'函數。這會將'$ time'對象轉換爲本地時間而不是GMT。如果您當地的時間是中央時間,這將起作用。也許真正的答案是使用[Slaven's](http://stackoverflow.com/a/19528445/368630)設置'$ ENV {TZ}變量並運行'tzset'的技巧。 –

3
use DateTime::Format::RFC3339 qw(); 
use DateTime::Format::Strptime qw(); 

my $in_dt_format = DateTime::Format::RFC3339->new(); 

my $out_dt_format = DateTime::Format::Strptime->new(
    pattern => '%m/%d/%Y %H:%M:%S', 
    on_error => 'croak', 
); 

my $dt = $in_dt_format->parse_datetime('2013-10-22T19:31:00Z'); 
$dt->set_time_zone('America/Chicago'); 
say $out_dt_format->format_datetime($dt); # 10/22/2013 14:31:00 
+0

我沒有第一個模塊'無法找到日期時間/格式/ RFC3339.pm' – BluGeni

+5

@BluGeni,所以安裝它。 – ikegami

+0

不適合我,不幸的是。這就是爲什麼我說我只需要一些核心Perl模塊 – BluGeni

3

這裏只用核心模塊的解決方案(當然,你需要有至少Perl的5.8):

use strict; 
use POSIX qw(tzset strftime); 
use Time::Local qw(timegm); 

my $iso_time = "2013-10-22T19:31:00Z"; 
my $formatted_time; 
{ 
    local $ENV{TZ} = "America/Chicago"; 
    tzset; 
    if (my($y,$m,$d,$H,$M,$S) = $iso_time =~ m{^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$}) { 
     $formatted_time = strftime '%m/%d/%Y %H:%M:%S', localtime timegm $S,$M,$H,$d,$m-1,$y; 
    } else { 
     # invalid ISO date, do something 
    } 
} 
tzset; # restore default time zone handling 

warn $formatted_time, "\n"; # output is "10/22/2013 14:31:00" 

有關TZ招一個字:通過設置環境變量TZ一些時間相關的libc函數(例如localtime)使用該時區而不是默認時區。如果在程序中設置了TZ環境變量,則必須調用tzset()來調整與內部時間相關的數據結構。並且不要忘記再次調用tzset()來重新恢復數據結構。

這應該適用於大多數Unix系統,但可能在Windows系統上運行,也可能不運行。

相關問題