2012-02-06 19 views
5

Quería saber si hay una forma de obtener la compensación de zona horaria para un intervalo de fechas determinado entre dos zonas horarias para una duración determinada.Obtener compensación de zona horaria entre dos zonas horarias para una duración determinada

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    ...missing magic to go here... 
} 

debe devolver el desplazamiento de zona horaria que es válido para la duración determinada. Sin embargo, si el desplazamiento cambia, debe devolver el rango de fechas para el que es válido.

Así que estoy buscando algo como esto:

getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC", "US/NEW_YORK") 

valor de retorno algo como esto

timezoneoffset[0]["range"]=[march 9 12am to march 11 2 am] 
timezoneoffset[0]["offset"]=5 
timezoneoffset[1]["range"]=[march 9 2 am to march 15 12 am] 
timezoneoffset[1]["offset"]=4 

Es sólo que no quiero para calcular las compensaciones de zona horaria para cada punto programado para el rango dado . Estaba buscando si hay alguna manera de obtener una búsqueda directa de compensaciones si va a cambiar.

Estoy trabajando con PHP, pero una solución en cualquier idioma será apreciada.

La solución MySQL también funcionará, ya que estará más optimizada para hacer esto en MySQL.

Respuesta

3

Suponiendo que tiene una versión más nueva de php (5.2.0+) la clase DateTimeZone es parte del núcleo de PHP y le permitirá usar la función getOffset() para hacer estos cálculos. Le permitirá pasar en un dateTime object y especificar una zona horaria. Si haces esto para tus dos fechas, deberías poder calcular todas las piezas que estás buscando obtener. Para usar un ejemplo de php.net:

// Create two timezone objects, one for Taipei (Taiwan) and one for 
// Tokyo (Japan) 
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei"); 
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo"); 

// Create two DateTime objects that will contain the same Unix timestamp, but 
// have different timezones attached to them. 
$dateTimeTaipei = new DateTime(mktime([the date in question]), $dateTimeZoneTaipei); 
$dateTimeJapan = new DateTime(mktime([the date in question]), $dateTimeZoneJapan); 


// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei 
// object, but using the timezone rules as defined for Tokyo 
// ($dateTimeZoneJapan). 
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei); 

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST). 
print("Number of seconds Japan is ahead of GMT at the specific time: "); 
var_dump($timeOffset); 

print("<br />Number of seconds Taipei is ahead of GMT at the specific time: "); 
var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 

print("<br />Number of seconds Japan is ahead of Taipei at the specific time: "); 
var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei) 
    -$dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 
+0

Sé acerca de get offset ... but get offset simplemente le da la compensación por un tiempo determinado ... lo que pasa es que tengo un cronograma con los cronogramas programados para diferentes horarios durante el día ... – user1192612

+0

Entonces, si recibo una solicitud para obtener los elementos del cronograma entre el 10 de marzo de 2012 a las 9 p.m. tom 11 de marzo a 9 a.m. la compensación va a variar durante este tiempo ... No quiero calcular las compensaciones para cada momento .. Y esto es solo para EE. UU .. los diferentes países tendrán diferentes días cuando el desplazamiento cambia ... y trato de encontrar el desplazamiento entre dos zonas horarias para un conjunto de duración no necesariamente UTC ... el problema es que no lo hago si calculo el desplazamiento en función de la hora de inicio, será el mismo en todo momento ..Pienso que PHP se compensa compensando el desplazamiento durante un tiempo dado .. Espero haber aclarado – user1192612

+0

En resumen, tengo que asumir que el desplazamiento puede variar durante un día, por ejemplo, 11 de marzo 12 a.m. o mrach 11 12 pm (el desplazamiento varía a las 2 a. m). Estoy tratando de cubrir este caso de esquina – user1192612

1

pienso de PHP DateTimeZone::getTransitions method puede llegar hasta allí. Tiene un alias de procedimiento, timezone_transitions_get().

public array DateTimeZone::getTransitions (
    [ int $timestamp_begin [, int $timestamp_end ]] ) 

Este método devuelve todas las "transiciones" de un valor de desfase de zona horaria a otro, para esa zona horaria, en un rango de tiempo dado.

Para sus fines, tendrá que crear DateTimeZone objetos para cada una de sus zonas horarias, llame DateTimeZone::getTransitions para el intervalo de fechas para obtener un conjunto de transiciones para esa zona horaria, a continuación, combinar y ordenar los dos conjuntos de transiciones. Esto le dará el equivalente de la matriz timezoneoffset[] que busca.

Algo así como:

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    DT1 = DateTimeZone(timezone1); 
    transitions1 = DT1->getTransitions(startDate,endDate); 
    DT2 = DateTimeZone(timezone2); 
    transitions1 = DT2->getTransitions(startDate,endDate); 
    timezoneoffset[] = // merge and sort (transitions1, transitions2) 
} 

El formato de la matriz de transiciones no está bien documentada. La documentación del método muestra algunos ejemplos de entradas:

Array 
(
... 
    [1] => Array 
     (
      [ts] => -1691964000 
      [time] => 1916-05-21T02:00:00+0000 
      [offset] => 3600 
      [isdst] => 1 
      [abbr] => BST 
     ) 

    [2] => Array 
     (
      [ts] => -1680472800 
      [time] => 1916-10-01T02:00:00+0000 
      [offset] => 0 
      [isdst] => 
      [abbr] => GMT 
     ) 
    ... 
) 

Me especulan que: ts se refiere a una marca de tiempo de PHP en cuestión de segundos época, tal como lo devuelve time(), dando el instante en el tiempo en el que los cambios offset al valor en este registro . time se refiere al mismo instante, como una cadena de formato de fecha y hora. offset es la compensación de la zona horaria en segundos desde UTC, a partir del instante time/ts, avanza a la siguiente transición. isdst es 1 si el desplazamiento se refiere a una compensación del horario de verano, 0 en caso contrario. abbr es una abreviatura de cadena para la zona horaria.Si alguien tiene información sólida sobre esta estructura de datos, sería una bondad agregarla al the documentation.

+0

Gracias Jim ... Exactamente lo que estaba buscando ... Pasé por el objeto datetime pero esto pasó por alto. – user1192612

Cuestiones relacionadas