2010-02-24 19 views
11

Estoy tratando de convertir una fecha/hora GMT 0 a GMT -6 en Perl.¿Cómo puedo convertir zonas horarias en Perl?

Por ejemplo, un tiempo de concesión servidor DHCP está en el siguiente formato:

2010/02/18 23:48:37

Estoy tratando de convertir ese tiempo para localtime zona (GMT -6) pero lo necesita para respetar el horario de verano.

El siguiente script puede ser excesivo, pero no estoy seguro de cómo proceder desde aquí. (Cualquier sugerencia sería increíble).

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

Será salida las siguientes líneas:

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

Necesito ser capaz de añadir a la -21600 fecha para obtener la zona horaria local de GMT -6, pero no estoy seguro de cómo abordar esto.

+3

Aparte de su uso en el Reino Unido, por favor utilice UTC, GMT en lugar de como el tiempo estándar internacional. Algunos sistemas suponen que GMT significa UTC, mientras que otros asumen GMT/BST, como se usa en el Reino Unido. – mctylr

+0

Supongo que hay más de una forma de hacerlo. – mob

Respuesta

18

llamada set_time_zone método 2 veces:

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 

como funciona:

  • cuando se crea DateTime objeto sin zona horaria especificada " "zona horaria flotante" se establece
  • primera llamada de set_time_zone cambie la zona horaria a UTC sin conversión
  • segundo llamado de set_time_zone cambio UTC a America/Chicago
+0

Correrlo por segunda vez fue la pieza que me faltaba. Funciona, gracias. – jinanwow

+1

¡Gracias por este consejo! Yo tampoco me había dado cuenta de que la segunda llamada a set_time_zone() era la clave. –

-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

Esto es totalmente erróneo a veces, ya que ignora la parte de la pregunta que dice "pero necesita honrar el horario de verano". –

1

Esto convertirá la hora UTC en el tiempo ETC. También puede usar la fecha/hora en cualquier formato usando el parámetro + FORMAT de la fecha.

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

Cuestiones relacionadas