2010-02-24 14 views
11

Próbuję przekonwertować datę/czas GMT 0 na GMT -6 w Perlu.Jak mogę przekonwertować strefy czasowe w Perlu?

Dla przykładu, czas dzierżawy DHCP Server jest w następującym formacie:

2010/02/18 23:48:37

Próbuję przekonwertować czasu do Localtime strefa (GMT -6), ale potrzebuje go, aby uwzględnić czas letni.

Poniższy skrypt może być przesadzony, ale nie jestem pewien, jak przejść dalej. (Wszelkie sugestie byłyby niesamowite).

my $TIMESTART; 

$TIMESTART = "2010/02/18 23:48:37"; 
$TIMESTART =~ s/\//-/g; 

use DateTime; 
use DateTime::TimeZone; 

use DateTime::Format::MySQL; 
my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART); 

my $tz = DateTime::TimeZone->new(name => 'America/Chicago'); 

print $tz->offset_for_datetime($dt) . "\n"; 

Będzie wyjściowe następujące linie:

2010-02-18T23: 48: 37
-21600

muszę być w stanie dodać -21600 do Data uzyskania lokalnej strefy czasowej GMT -6, ale nie jestem pewien, jak to uwzględnić.

+3

Inne niż do użytku w Wielkiej Brytanii, użyj UTC, zamiast GMT jako międzynarodowej normy czasu. Niektóre systemy zakładają, że GMT oznacza UTC, podczas gdy inne przyjmują GMT/BST, jak używane w Wielkiej Brytanii. – mctylr

+0

Sądzę, że istnieje więcej niż jeden sposób, aby to zrobić. – mob

Odpowiedz

18

połączeń set_time_zone metoda 2 godzinach:

my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART); 
$dt->set_time_zone('UTC'); ## set timezone of parsed date time 
$dt->set_time_zone('America/Chicago'); ## change timezone in safe way 

print DateTime::Format::MySQL->format_datetime($dt),"\n"; ## check the result 

Jak to działa:

  • podczas tworzenia DateTime obiektu bez strefy czasowej określonej " pływająca "strefa czasowa jest ustawiona na
  • pierwsza rozmowa z set_time_zone zmiana strefy czasowej na UTC bez konwersji
  • sekund wezwanie set_time_zone zmiany UTC do America/Chicago
+0

Uruchamianie go po raz drugi było tym, czego mi brakowało. Działa, dzięki. – jinanwow

+1

Dzięki za tę wskazówkę! Ja też nie zdawałem sobie sprawy, że drugie wezwanie do set_time_zone() było kluczem. –

-2
#!/usr/bin/perl -w 
($sec,$min,$hour,$mday,$mon,$year) = gmtime(time+21600); 
$year = $year + 1900; 
printf("%02d:%02d:%02d %02d.%02d.%04d\n", $hour,$min,$sec,$mday,$mon,$year); 
+1

Jest to czasami błędne, ponieważ ignoruje część pytania, która mówi: "ale potrzebuje go, aby uwzględnić czas letni". –

1

To będzie konwertować czasu UTC na czas itp. Możesz także użyć daty/czasu w dowolnym formacie używając parametru + FORMAT daty.

data --date = 'TZ = "ETC" 18:30'