parse fecha convert javascript

javascript - convert - fecha de conversión a GMT 0



local date to utc javascript (8)

¿Cómo convertir la fecha de diferentes zonas horarias a GMT 0? Digamos que tengo fechas como esta

Fri Jan 20 2012 11:51:36 GMT-0500 Fri Jan 20 2012 11:51:36 GMT-0300 Fri Jan 20 2012 11:51:36 GMT+0500

a

Fri Jan 20 2012 06:51:36 GMT Fri Jan 20 2012 08:51:36 GMT Fri Jan 20 2012 16:51:36 GMT

estas son fechas que recibo a través de new Date().toString() en diferentes zonas horarias. ¿Hay algún método js para detectar la zona horaria y convertir en consecuencia?

EDITAR: Las segundas tres fechas no son las horas convertidas GMT de las tres primeras. Por ejemplo, Fri Jan 20 2012 11:51:36 GMT-0500 en GMT es Fri Jan 20 2012 16:51:36 GMT no Fri Jan 20 2012 06:51:36 GMT . GMT-0500 está detrás de GMT, no delante, por lo que debe agregar el desplazamiento para obtener GMT, no restarlo.


Aunque parece lógico, la respuesta aceptada es incorrecta porque las fechas de JavaScript no funcionan así.

Es muy importante señalar aquí que el valor numérico de una fecha (es decir, new Date()-0 o Date.now() ) en JavaScript siempre se mide como milsegundos ya que la época que es una cantidad libre de zona horaria se basa en una precisión instante exacto en la historia del universo . No necesita agregar o restar nada al valor numérico devuelto por Date() para convertir el valor numérico en una zona horaria, porque el valor numérico no tiene zona horaria . Si tuviera una zona horaria, todo lo demás en las fechas de JavaScript no funcionaría.

Las zonas horarias, los años bisiestos, los segundos intercalados y todos los otros ajustes infinitamente complicados de nuestras horas y fechas locales se basan en este valor numérico constante e inequívoco, y no al revés.

Aquí hay ejemplos de cómo el valor numérico de una fecha (proporcionado al constructor de fecha) es independiente de la zona horaria:

En el horario estándar central:

new Date(0); // Wed Dec 31 1969 18:00:00 GMT-0600 (CST)

En Anchorage, Alaska:

new Date(0); // Wed Dec 31 1969 15:00:00 GMT-0900 (AHST)

En París, Francia:

new Date(0); // Thu Jan 01 1970 01:00:00 GMT+0100 (CET)

Es fundamental observar que, en TODOS los casos, en función del desfase de época libre de zona horaria de cero milisegundos, el tiempo resultante es idéntico. La 1 am en París, Francia, es exactamente el mismo momento que las 3 p. M. Del día anterior en Anchorage, Alaska, que es exactamente el mismo momento que las 6 p. M. En Chicago, Illinois.

Por esta razón, la respuesta aceptada en esta página es incorrecta. Observar:

// Create a date. date = new Date(); // Fri Jan 27 2017 18:16:35 GMT-0600 (CST) // Observe the numerical value of the date. date.valueOf(); // 1485562595732 // n.b. this value has no timezone and does not need one!! // Observe the incorrectly "corrected" numerical date value. date.valueOf() + date.getTimezoneOffset() * 60000; // 1485584195732 // Try out the incorrectly "converted" date string. new Date(date.valueOf() + date.getTimezoneOffset() * 60000); // Sat Jan 28 2017 00:16:35 GMT-0600 (CST) /* Not the correct result even within the same script!!!! */

Si tiene una cadena de fecha en otra zona horaria, no es necesaria ninguna conversión al objeto resultante creado por la new Date("date string") . ¿Por qué? El valor numérico de JavaScript de esa fecha será el mismo independientemente de su zona horaria. JavaScript pasa automáticamente por procedimientos increíblemente complicados para extraer la cantidad original de milisegundos desde la época, sin importar la zona horaria original.

La conclusión es que al conectar una cadena de fecha textual x en el new Date(x) constructor new Date(x) se convertirá automáticamente de la zona horaria original, cualquiera que sea, en la representación de tiempo de epoch milliseconds timezone que es igual independientemente de cualquier zona horaria . En su aplicación actual, puede optar por mostrar la fecha en cualquier zona horaria que desee, pero NO sume / reste al valor numérico de la fecha para hacerlo. Toda la conversión ya ocurrió en el instante en que se creó el objeto de fecha. La zona horaria ya no está allí, porque el objeto de fecha se crea una instancia utilizando un sentido del tiempo definido con precisión y libre de zona horaria.

La zona horaria solo comienza a existir nuevamente cuando se considera el usuario de su aplicación. El usuario tiene una zona horaria, por lo que simplemente muestra esa zona horaria al usuario. Pero esto también sucede automáticamente .

Consideremos un par de las fechas en su pregunta original:

date1 = new Date("Fri Jan 20 2012 11:51:36 GMT-0300"); // Fri Jan 20 2012 08:51:36 GMT-0600 (CST) date2 = new Date("Fri Jan 20 2012 11:51:36 GMT-0300") // Fri Jan 20 2012 08:51:36 GMT-0600 (CST)

La consola ya conoce mi zona horaria, por lo que me ha mostrado automáticamente lo que esos tiempos significan para mí.

Y si desea saber la hora en representación GMT / UTC, ¡tampoco se necesita conversión! No cambias el tiempo en absoluto. Simplemente muestra la cadena UTC de la hora:

date1.toUTCString(); // "Fri, 20 Jan 2012 14:51:36 GMT"

El código que se escribe para convertir zonas horarias numéricamente utilizando el valor numérico de una fecha de JavaScript casi se garantiza que fallará. Las zonas horarias son demasiado complicadas, y es por eso que JavaScript fue diseñado para que no sea necesario.


Estaba trabajando en esto, puede ser un poco tarde, pero hice una solución. Estos son algunos pasos: - Obtenga la hora actual desde cualquier zona horaria en la que se active la aplicación. - Obtenga el desplazamiento de la zona horaria de esa zona desde gmt 0. luego agregue el valor de la zona horaria en milisegundos. Obtendrá la fecha en su zona horaria. Agregué un código adicional para eliminar cualquier cosa después del tiempo real.

getCurrentDate() { var date = new Date(); var newDate = new Date(8 * 60 * 60000 + date.valueOf() + (date.getTimezoneOffset() * 60000)); var ampm = newDate.getHours() < 12 ? '' AM'' : '' PM''; var strDate = newDate + ''''; return (strDate).substring(0, strDate.indexOf('' GMT'')) + ampm }


Estoy intentando con lo siguiente. Esto parece estar funcionando bien. ¿Hay alguna limitación en este enfoque? Por favor confirmar.

var now=new Date(); // Sun Apr 02 2017 2:00:00 GMT+1000 (AEST) var gmtRe = /GMT([/-/+]?/d{4})/; var tz = gmtRe.exec(now)[1]; // +1000 var hour=tz/100; // 10 var min=tz%100; // 0 now.setHours(now.getHours()-hour); now.setMinutes(now.getMinutes()-min); // Sat Apr 01 2017 16:00:00 GMT


GMTDate = new Date (). ToGMTString ();


Puede usar Date.getTimezoneOffset() . Esto devuelve la diferencia de tiempo entre su fecha y GMT en minutos.

Multiplique esto por 60,000 (milisegundos en un minuto) para obtener los milisegundos y restar de la fecha para crear una nueva fecha.

new Date(date.valueOf() + date.getTimezoneOffset() * 60000);


Según la respuesta aceptada y la segunda respuesta de puntuación más alta, ambos no son perfectos de acuerdo con el comentario, así que mezclé ambos para obtener algo perfecto:

var date = new Date(); //Current timestamp date = date.toGMTString(); //Based on the time zone where the date was created console.log(date); /*based on the comment getTimezoneOffset returns an offset based on the date it is called on, and the time zone of the computer the code is running on. It does not supply the offset passed in when constructing a date from a string. */ date = new Date(date); //will convert to present timestamp offset date = new Date(date.getTime() + (date.getTimezoneOffset() * 60 * 1000)); console.log(date);


Simplemente puede usar los métodos toGMTString (o toISOString ) del objeto date.

Ejemplo:

new Date("Fri Jan 20 2012 11:51:36 GMT-0500").toGMTString() // Output: "Fri, 20 Jan 2012 16:51:36 GMT"

Si prefiere un mejor control del formato de salida, considere usar una biblioteca como moment.js .

Además, en su pregunta, realmente ha convertido la hora de forma incorrecta. Cuando se muestra un desplazamiento en una cadena de marca de tiempo, significa que los valores de fecha y hora en la cadena ya se han ajustado desde UTC en ese valor. Para volver a convertir a UTC, invierta el signo antes de aplicar el desplazamiento.

11:51:36 -0300 == 14:51:36Z