2010-07-07 16 views
7

Necesito compensar el tiempo por una hora si actualmente es horario de verano en la zona horaria del Pacífico. ¿Cómo puedo determinar el estado de ahorro de luz natural actual de la Zona horaria del Pacífico, independientemente de la zona horaria local del usuario?Tiempo de compensación para horario de verano en una zona horaria específica usando JavaScript

Esto es lo que tengo hasta ahora. "dst" en la línea 4 es solo un marcador de posición para una función que me dirá si el horario de verano está activo en esa zona.

function checkTime() { 
    var d = new Date(); 
    var hour = d.getUTCHours(); 
    var offset = dst ? 7 : 8; // is pacific time currently in daylight savings? 

    // is it currently 6 AM, 2 PM, or 10 PM? 
    if (hour === ((6 + offset) % 24) || hour === ((14 + offset) % 24) || hour === ((22 + offset) % 24)) { 
     // do stuff 
    } 
} 

checkTime(); 
+0

Bienvenido a SO, por favor no se olvide de visitar http://stackoverflow.com/faq – Reigel

+0

he hecho una pregunta relacionada, donde me identifico varias maneras de hacer lograr esto, ninguno de los cuales me encuentro óptimo. Sin embargo, todavía pueden ser pertinentes.http://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time-in-javascript – Tauren

Respuesta

2

La única manera usted será capaz de saber con seguridad es si usted tiene la información de horario de verano (incluyendo cualquier actualización) disponibles en el servidor puede preguntar. La PC del usuario no necesita ni siquiera tener instalada la información de la zona horaria.

Luego necesita una secuencia de comandos "dinámica" para obtener el estado de DST.

Posibles métodos: Referencia a una página PHP/ASPX/JSP/CFM/ASP que genera un javascript para establecer una variable que indica si DST está activo o no, o la cantidad actual de minutos compensados.

Escriba la secuencia de comandos directamente en su página (con suerte dinámica).

Utilice AJAX/REST/JSON para acceder a un servicio de Fecha/Hora en algún lugar que le indique el estado del horario de verano o la cantidad de minutos compensados ​​desde el UTC para una zona horaria/ubicación.

Los minutos son preferibles a las horas porque los desplazamientos del horario de verano son en minutos en todo el mundo, no en horas.

1

También he luchado con esto antes en un sitio web basado en PHP que se supone que muestra el "reloj mundial". No hay una buena manera de lograr esto en JS e incluso entonces, dependes en gran medida del entorno del cliente. Realmente necesita hacer esta tarea en el idioma del lado del servidor que está utilizando.

Si sucede que usted está usando PHP así, entonces usted puede encontrar útil este fragmento:

function get_offset_with_DST($timezone_name) { 
    $default_timezone = date_default_timezone_get(); 
    date_default_timezone_set($timezone_name); 
    $offset_with_DST = date('Z')/3600; 
    date_default_timezone_set($default_timezone); 
    return $offset_with_DST; 
} 

y luego en JS:

<script>var offsetWithDST = <?= get_offset_with_DST('US/Pacific'); ?>;</script> 

Para obtener una lista de todos apoyado zona horaria nombres en PHP, marque this page.

0

En los EE. UU., El horario de verano se calcula actualmente como el tiempo que cae entre el segundo domingo de marzo y el primer domingo de noviembre.

Para calcular la fecha en que comienza el horario de verano, primero calculamos el año actual, luego el día de la semana a la que cae el primero de marzo, y de acuerdo con eso podemos calcular el segundo domingo. Lo mismo se hace para noviembre, y finalmente una prueba de si la fecha de hoy cae entre las dos fechas de anclaje. dst se cambia a "1" cuando es verdadero.

Para mis necesidades, la precisión a nivel de día es adecuada, pero podría construirse con mayor precisión.

var dst = 0 
    var d = new Date(); 
    var myYear = parseInt(d.getFullYear()) 
    d.setFullYear(myYear , 2, 1); 
    var what_Weekday_Mar1 = d.getDay(); 

    var DST_StartDay 

    switch(what_Weekday_Mar1) { 
     case 0: 
      DST_StartDay = 14 
      break; 
     case 1: 
      DST_StartDay = 13 
      break; 
     case 2: 
      DST_StartDay = 12 
      break; 
     case 3: 
      DST_StartDay = 11 
      break; 
     case 4: 
      DST_StartDay = 10 
      break; 
     case 5: 
      DST_StartDay = 9 
      break; 
     case 6: 
      DST_StartDay = 8 
      break; 
    } 

    var DST_on_Date = new Date() 
    DST_on_Date = DST_on_Date.setFullYear(myYear,2,DST_StartDay) 

    d.setFullYear(myYear , 10, 1); 
    var what_Weekday_Nov1 = d.getDay(); 

    switch(what_Weekday_Nov1) { 
     case 0: 
      DST_EndDay = 1 
      break; 
     case 1: 
      DST_EndDay = 7 
      break; 
     case 2: 
      DST_EndDay = 6 
      break; 
     case 3: 
      DST_EndDay = 5 
      break; 
     case 4: 
      DST_EndDay = 4 
      break; 
     case 5: 
      DST_EndDay = 3 
      break; 
     case 6: 
      DST_EndDay = 2 
      break; 
    } 
    var DST_off_Date = new Date() 
    DST_off_Date = DST_off_Date.setFullYear(myYear,10,DST_EndDay) 

    var toDay = new Date(); 

    /*if today is between Daylight Savings On and Off times */ 
    if (today>DST_on_Date && today<DST_off_Date) { 
     dst = 1;  
    } 

Espero que esto ayude!

-RL

Cuestiones relacionadas