¿Cómo convertir la fecha de Moment.js a la zona horaria local de los usuarios?

84

Utilizo los marcos Moment.js y Moment-Timezone, y tengo un objeto de fecha Moment.js que está explícitamente en la zona horaria UTC. ¿Cómo puedo convertir eso a la zona horaria actual del navegador?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

Así que estaría bien si pudiera averiguar la zona horaria local de los usuarios; o, alternativamente, me gustaría convertir el objeto de fecha en otro objeto de datos que solo use la "zona horaria local", sin importar cuál sea realmente.

Oliver
fuente

Respuestas:

139

No es necesario utilizar la zona horaria de momento para esto. La biblioteca principal moment.js tiene funcionalidad completa para trabajar con UTC y la zona horaria local.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Desde allí, puede usar cualquiera de las funciones que podría esperar:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Tenga en cuenta que al pasar testDateUtc, que es un momentobjeto, de nuevo al moment()constructor, crea un clon . De lo contrario, cuando llama .local(), también cambiaría el testDateUtcvalor, en lugar de solo el localDatevalor. Los momentos son mutables .

También tenga en cuenta que si su entrada original contiene un desplazamiento de zona horaria como +00:00o Z, entonces puede analizarlo directamente con moment. No es necesario utilizar .utco .local. Por ejemplo:

var localDate = moment("2015-01-30T10:00:00Z");
Matt Johnson-Pinta
fuente
4
Debe tener en cuenta que este método no tiene en cuenta las compensaciones DST, es más seguro usar la moment-timezonebiblioteca
Jaime Agudo
2
@Jaime no es cierto. localde hecho tiene en cuenta el horario de verano.
Matt Johnson-Pint
Puedes comprobarlo por tu cuenta, por ejemplo, traduciendo del ESTa CET, mañana pondré un ejemplo si quieres como NY-> Madrid. Aceptaré el contraejemplo :)
Jaime Agudo
1
tiene razón en que el momento no puede realizar ese tipo de conversión sin una zona horaria. Sin embargo, puede convertir correctamente entre UTC y local, que es lo que pidió el OP.
Matt Johnson-Pint
2
Las reglas locales provienen del navegador. Entonces, siempre que la zona horaria local incluya DST, moment lo usará.
Matt Johnson-Pint
23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Defina su formato de fecha.
  2. Cree un objeto de momento y establezca el indicador UTC en verdadero en el objeto.
  3. Cree un objeto de momento localizado convertido a partir del objeto de momento original.
  4. Devuelve una cadena formateada del objeto de momento localizado.

Ver: http://momentjs.com/docs/#/manipulating/local/

AndrewHenderson
fuente
Esta respuesta sería aún mejor si explicara por qué funciona, tal vez con referencias a la documentación. Además, es posible que desee explicar en qué se diferencia esta respuesta de la publicada en marzo ...
Mono hereje
@AndrewHenderson, la hora está una hora por delante de la hora local de la máquina. ¿Por qué sucede?
Ramesh Papaganti
@RameshPapaganti ¿Quizás el horario de verano? Por ejemplo, PDT vs PST. Se sabe que Moment cambia la API entre versiones, especialmente cuando se trata de localización. Avísame si encontraste la causa.
AndrewHenderson
6

Esto es lo que hice:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

¿Dónde {{ time }}está la marca de tiempo utc?

sayan
fuente
3

Utilice la función utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
Alexey Ryazhskikh
fuente