Digamos usuario en CA, NOS recoge la fecha, la hora y la zona horaria:

Todo el mundo de la cerveza maratón comienza en 8/15/2013 10:00 am, UTC-08:00

Otro usuario, en Europa Central se abre la página donde esta la fecha y la hora se muestra. Él no quiere hacer los cálculos de tiempo (había unas cervezas ya). Él sólo quiere ver de esta fecha y hora:

8/15/2013 19:00

Dado el navegador recibe la información de fecha y hora, como el introducido por el usuario en California:

Hay una manera, en javascript, sin servicios web externos, para hacer una correcta conversión? Es decir, para detectar que 10am UTC-08:00 en realidad debería ser de 10 am UTC-07:00, ya que es el Horario de verano.

Tal vez tengo un mal entendimiento acerca de esto desde el principio, pero no quiero dejar la entrada del usuario a pensar si se debe elegir UTC-08:00 (PST) o UTC-07:00 (PDT). Supongo que dado que la norma en la zona horaria de CA es el PST, la gente no cambie a pensar en la TFD en el tiempo de verano. ¿O no?!

En el centro de Europa, de fecha estándar es UTC+01:00, el Horario de verano fecha es UTC+02:00. De modo que la diferencia entre CA y Europa debe ser de 9 horas, salvo dos períodos en un año, cuando una o la otra zona alterna entre el Estándar y el Horario de los modos de Ahorro.

Actualización:

Después de algo más de pensar y de leer los comentarios, lo que sería lo ideal es que necesitas es este:

var utcOffset = f('2013-08-15T10:00', 'America/Los_Angeles');
//utcOffset == "-07:00"
var utcOffset = f('2013-11-15T10:00', 'America/Los_Angeles');
//utcOffset == "-08:00"

Hasta el momento, parece que el momento.js/zona horaria plugin, sugerido por Guido Preite es capaz de hacer esto (más o menos).

Cualquier otra manera, utilizando el explorador de Api?

compruebe Moment.js y Moment Timezone momentjs.com/timezone
Yo uso moment.js ya. La zona Horaria de extensión se ve prometedor. El generado zonas horarias archivo contiene el Ahorro de la Luz de conversión de datos. Después de una rápida realización de las pruebas, fue capaz de ajustar correctamente la hora introducida. Así que esto se parece a los navegadores no son capaces de decir “hey, para esta fecha en la que usted tiene que utilizar este desplazamiento de UTC, ya que a esa fecha, no es el tiempo de Verano”?

OriginalEl autor rdamborsky | 2013-08-02

3 Comentarios

  1. 22

    Hay una manera, en javascript, sin servicios web externos, para hacer una correcta conversión? Es decir, para detectar que 10am UTC-08:00 en realidad debería ser de 10 am UTC-07:00, ya que es el Horario de verano.

    10:00 a las 8 y a las 10:00-7 son dos momentos diferentes en el tiempo. Son iguales a las 18:00Z y de 17:00Z, respectivamente (Z = UTC). Cuando se mide en términos de un desplazamiento, el horario de verano no entrar en el cuadro. Nunca.

    Supongo que dado que la norma en la zona horaria de CA es el PST, la gente no cambie a pensar en la TFD en el tiempo de verano. ¿O no?!

    En general, la gente sólo piensa en “la Hora del Pacífico”, y que significa tanto PST en el invierno, y el PDT en el verano. Pero los equipos son más precisos. Cuando vea PST, que significa UTC-8. Cuando vea PDT, que significa UTC-7. Sería válido etiqueta utilizando un formulario, mientras que, simultáneamente, refiriéndose a que el desplazamiento de los otros.

    Zona horaria de abreviaturas puede ser ambiguo. Idealmente, cuando se hace referencia a la zona de programación, usted debe utilizar la IANA nombre de la zona, tales como America/Los_Angeles. Sin embargo, esto no es posible en la actualidad en todos los tiempos de ejecución de JavaScript sin necesidad de una biblioteca. (Están trabajando en esto, sin embargo.)

    En el centro de Europa, de fecha estándar es UTC+01:00, el Horario de verano fecha es UTC+02:00. De modo que la diferencia entre CA y Europa debe ser de 9 horas, salvo dos períodos en un año, cuando una o la otra zona alterna entre el Estándar y el Horario de los modos de Ahorro.

    Correcta. Pueden ser de 8, 9, o 10 horas de diferencia. Cambian completamente diferentes veces, aunque, así que no trate de manejar esto por sí mismo.

    Hasta ahora, parece que, de momento.js/zona horaria plugin, sugerido por Guido Preite es capaz de hacer esto (más o menos).

    De momento la zona horaria es una gran biblioteca. Sin embargo, a partir de la situación que se describe, no creo que usted necesita preocuparse acerca de la conversión de zona horaria como mucho de ustedes están pensando. Vea si usted puede seguir esta lógica:

    1. El usuario en California entra en una fecha y una hora en un cuadro de texto.
    2. De leer que el valor del campo de texto en una cadena, y analizarlo en una fecha:

      var dt = new Date("8/15/2013 10:00");

      o el uso de moment.js:

      var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
    3. Porque esto se está haciendo en el ordenador del usuario, JavaScript automáticamente asumen que este es un local la fecha y la hora. Usted no necesita proporcionar cualquier compensación o la información de zona horaria.

    4. Esto significa que, debido a las transiciones de horario que el momento en que entró podría ser válido o ambigua. JavaScript no hacer un gran trabajo en el manejo de que, en realidad, usted obtendrá resultados diferentes en los diferentes navegadores. Si quieres ser inequívoca, a continuación, habría que proporcionar un desplazamiento.

      //PST
      var dt = new Date("3/11/2013 1:00 UTC-08:00");
      
      //PDT
      var dt = new Date("3/11/2013 1:00 UTC-07:00");
    5. Una vez que usted tiene un Date (o un moment), entonces se puede evaluar su UTC equivalente:

      var s = dt.toISOString();  // 2013-08-15T17:00:00Z

      es la misma con moment.js pero usted tendrá un mejor soporte de los navegadores:

      var s = m.toISOString();  // 2013-08-15T17:00:00Z
    6. Almacenar UTC valor en la base de datos.

    7. El otro usuario en el centro de Europa viene y carga los datos.

    8. Que se alimentan en un Date o moment en JavaScript:

      var dt = new Date("2013-08-15T17:00:00Z");

      o con moment.js (de nuevo, el mejor navegador de apoyo)

      var m = moment("2013-08-15T17:00:00Z")
    9. Debido a que JavaScript sabe las reglas de zona horaria del equipo local, ahora se puede ver de esta fecha y será presentado con la Europa Central, zona horaria:

      var s = dt.ToString();  // browser specific output
      //ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"

      o con moment.js usted puede controlar el formato de salida mejor

      var s = m.format("DD/MM/YYYY HH:mm"); //"15/08/2013 19:00"

      también puede dejar que moment.js decidir qué localizada de un formato de salida:

      var s = m.format("llll"); //"Thu, 15 Aug 2013 19:00"

    Para resumir – si usted está interesado sólo en la conversión y de la zona horaria local (sea cual sea la zona que sea), entonces usted puede hacer todo con un solo Date. Moment.js hará las cosas más fáciles para el análisis y el formato, pero no es absolutamente necesario.

    Sólo hay un par de escenarios que requieren una zona horaria de la biblioteca (tales como el momento-la zona horaria u otros).

    • Que quiere convertir a o desde una zona a la que se no la zona de hora local o UTC.

    • Está trabajando con las fechas que estamos en el pasado, y ha habido un cambio en las reglas de zona horaria o reglas del horario de verano desde entonces, y tiene fechas que podría ser interpretado de manera diferente bajo las nuevas reglas que con los antiguos. Esto es un poco técnico, pero no es así. Leer más aquí y aquí.

    Gracias Matt por una exhaustiva información, enlaces y guía. Mi escenario es exactamente el primero que señaló: “la conversión no es de la zona horaria local. Es decir, el usuario que ingresa la fecha y la hora, también entra en la zona horaria que es relevante para ese momento. Esto no necesariamente tiene que ser de la zona horaria del usuario se encuentra ubicado en. Veo que debo estado con más claridad en la pregunta.
    He de decir que es ridículo que javascript, la programación de idioma de la “world wide web” no se han construido en el tiempo de conversión / zona horaria de herramientas

    OriginalEl autor Matt Johnson

  2. 1

    Constructor por defecto crea la instancia de la hora local

    var localDate = new Date(); 

    Yo no puedo probarlo ahora mismo, pero usted debe ser capaz de proporcionar a su datetime (como parámetro en el constructor)..

    var eventDate = [SOMEDATE];
    var localDate = new Date(eventDate);

    ..y, a continuación, usted debe ser capaz de llamar a la Fecha objeto de funciones como el método getmonth, que devuelve los datos en la zona horaria local. Como está escrito en: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

    Nota 1: Sin server = no hay servidor|db a todos? Si la hay, la fecha debe ser guardado como UTC en db y de carga como la hora local de cada usuario.. de esa manera usted no tiene que preocuparse de las conversiones.

    Note2: Esta pregunta tiene algo de código que muestra cómo obtener la diferencia horaria: Cómo obtener la hora local exacta de cliente?

    Sí, esto generalmente funciona ok. El problema es cuando el usuario entra explícito de zona horaria para ser utilizado para la fecha de ser salvos. Imagine que usted envíe 07/20/2013 10:00 UTC-08:00 al pensar en esto como el tiempo en CA. Pero esta información es incorrecta, ya que en esa fecha dada -07:00 debe ser utilizado para el desplazamiento de utc. Y esto es lo que necesito para detectar y resolver. El almacenamiento/recuperación de parte es fácil, una vez que la fecha se guarda correctamente. Quiero evitar decisión entre estándar/hora de verano durante la entrada en la fase.

    OriginalEl autor Damb

  3. 1

    He desarrollado esta solución basada en otros ejemplos…espero que esto funcione para usted! Disponible en jsfiddle.

    /* 
    * Author: Mohammad M. AlBanna
    * Website: MBanna.me
    * Description: Get the current time in different time zone 
    */
    //Check daylight saving time prototype
    Date.prototype.stdTimezoneOffset = function() {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
    }
    Date.prototype.dst = function() {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
    }
    var today = new Date();
    var isDST = today.dst() ? true : false;
    var pstOffset = isDST ? 7 : 8;
    var cstOffset = isDST ? 5 : 6;
    var estOffset = isDST ? 4 : 5;
    var gmtOffset = 1;
    pstOffset = pstOffset * 60 * 60 * 1000;
    cstOffset = cstOffset * 60 * 60 * 1000;
    estOffset = estOffset * 60 * 60 * 1000;
    gmtOffset = gmtOffset * 60 * 60 * 1000;
    var todayMillis = today.getTime();
    var timeZoneOffset = (today.getTimezoneOffset() * 60 * 1000);
    var curretPST = todayMillis - pstOffset; 
    var curretCST = todayMillis - cstOffset; 
    var curretEST = todayMillis - estOffset;
    var curretGMT = todayMillis - gmtOffset;
    addP("PST Time : " + new Date(curretPST).toUTCString());
    addP("CST Time : " + new Date(curretCST).toUTCString());
    addP("EST Time : " + new Date(curretEST).toUTCString());
    addP("GMT Time : " + new Date(curretGMT).toUTCString());
    addP("Local Time : " + new Date(today.getTime() - timeZoneOffset ).toUTCString());
    function addP(value){
    var p = document.createElement("p");
    p.innerHTML = value;
    document.body.appendChild(p);
    }

    OriginalEl autor Mohammad AlBanna

Dejar respuesta

Please enter your comment!
Please enter your name here