2010-02-01 12 views
6

Stosując tę ​​funkcję:Jak zmienić strefę czasową wartości datetime w Perlu?

perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 

To zwróci epochtime - ale tylko w GMT - jeśli chcę wynik w GMT + 1 (który jest localtime systemy (TZ)), co muszę zmienić ?

Dzięki z góry,

Anders

+0

sprawdzić te: [http://www.bestofperl.com/how -tos/timezone-conversion-date-time] (http://www.bestofperl.com/how-tos/timezone-conversion-date-time) [http: // w ww.bestofperl.com/how-tos/parsing-datetime-strings](http://www.bestofperl.com/how-tos/parsing-datetime-strings) – Pradeep

Odpowiedz

4

Istnieje tylko jedna standardowa definicja epochtime, oparta na UTC, a nie różnych epokach dla różnych stref czasowych.

Jeśli chcesz znaleźć offset between gmtime and localtime użyć

use Time::Local; 
@t = localtime(time); 
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t); 
2

Trzeba tylko ustawić strefę czasową. Wypróbuj:

 
env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 
+2

TLA czasowe są wieloznaczne i słabo określone. Lepiej używać nazw [zoneinfo] (http://en.wikipedia.org/wiki/Olson_database): 'TZ = Europe/Berlin perl ...' – daxim

+1

Oto link bezpośrednio do [listy prawidłowej strefy czasowej ciągi znaków) (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) aka 'Zone.tab'. –

2

Time::Local::timelocal jest odwrotnością localtime. Wynik będzie w czasie lokalnym swojego gospodarza:

$ perl -MTime::Local -le \ 
    'print scalar localtime timelocal "00","00","00","01","01","2000"' 
Tue Feb 1 00:00:00 2000

Czy chcesz gmtime odpowiadającą tej localtime?

$ perl -MTime::Local' -le \ 
    'print scalar gmtime timelocal "00","00","00","01","01","2000"' 
Mon Jan 31 23:00:00 2000

Chcesz to na odwrót, localtime która odpowiada tej gmtime?

$ perl -MTime::Local -le \ 
    'print scalar localtime timegm "00","00","00","01","01","2000"' 
Tue Feb 1 01:00:00 2000
+0

Głosuj, dobre informacje. Dzięki. – Anders

2

Podczas :: Czas lokalny jest rozsądnym rozwiązaniem może być lepiej przy użyciu bardziej nowoczesny obiekt DateTime zorientowany moduł. Oto przykład:

use strict; 
use DateTime; 
my $dt = DateTime->now; 
print $dt->epoch, "\n"; 

Do stref czasowych można użyć modułu DateTime :: TimeZone.

use strict; 
use DateTime; 
use DateTime::TimeZone; 

my $dt = DateTime->now; 
my $tz = DateTime::TimeZone->new(name => "local"); 

$dt->add(seconds => $tz->offset_for_datetime($dt)); 

print $dt->epoch, "\n"; 

CPAN Linki:

DateTime

3
use DateTime; 
my $dt = DateTime->now; 
$dt->set_time_zone('Europe/Madrid'); 
0

inny przykład na podstawie DateTime::Format::Strptime

use strict; 
use warnings; 
use v5.10; 
use DateTime::Format::Strptime; 

my $s = "2016-12-22T06:16:29.798Z"; 
my $p = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%T.%NZ", 
    time_zone => "UTC" 
); 

my $dt = $p->parse_datetime($s);  
$dt->set_time_zone("Europe/Berlin"); 
say join ' ', $dt->ymd, $dt->hms; # shows 2016-12-22 07:16:29 
Powiązane problemy