2010-02-24 8 views
11

J'essaie de convertir une date/heure GMT 0 en GMT -6 en Perl.Comment puis-je convertir des fuseaux horaires en Perl?

Par exemple, une durée de bail DHCP Server est dans le format suivant:

2010/02/18 23:48:37

Je suis en train de convertir ce temps au Localtime zone (GMT -6) mais en ont besoin pour honorer l'heure d'été.

Le script ci-dessous est peut-être trop lourd, mais je ne suis pas sûr de savoir comment procéder à partir de là. (Toutes les suggestions seraient géniales).

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"; 

Il va afficher les lignes suivantes:

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

Je dois pouvoir ajouter -21600 à la date pour obtenir le fuseau horaire local de GMT -6 mais je ne suis pas sûr de savoir comment approcher cela.

+3

Autre que l'utilisation au Royaume-Uni, s'il vous plaît utiliser UTC, plutôt que GMT comme heure standard internationale. Certains systèmes supposent que GMT signifie UTC, tandis que d'autres supposent que GMT/BST est utilisé au Royaume-Uni. – mctylr

+0

Je suppose qu'il y a plus d'une façon de le faire. – mob

Répondre

18

méthode d'appel set_time_zone 2 fois:

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 

Comment ça marche:

  • lorsque vous créez objet DateTime without time zone spécifiée, " flottant "fuseau horaire est réglé
  • premier appel de set_time_zone changer de fuseau horaire à UTC sans conversion
  • deuxième appel de
  • set_time_zone changement UTC à America/Chicago
+0

L'exécution la deuxième fois était la pièce qui me manquait. Cela fonctionne, merci. – jinanwow

+1

Merci pour cette astuce! Moi aussi je n'avais pas réalisé que le second appel à set_time_zone() était la clé. –

-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

Ceci est parfois faux, car il ignore la partie de la question qui dit «mais il faut qu'il honore l'heure avancée». –

1

Cela va convertir le temps UTC en temps ETC. Vous pouvez également utiliser la date/l'heure dans n'importe quel format en utilisant le paramètre + FORMAT de la date.

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

Questions connexes