Momento Js UTC a hora local

145

Estoy tratando de convertir la hora UTC a la hora local. He estado siguiendo este ejemplo desde este enlace: http://jsfiddle.net/FLhpq/4/light/ . Parece que no puedo obtener la salida local correcta. Por ejemplo, si son las 10:30 am aquí, en lugar de las 10:30, obtendré las 15:30. Aquí está mi código:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

var localTime  = moment.utc(date).toDate();

localTime = moment(localTime).format('YYYY-MM-DD HH:mm:ss');

console.log("moment: " + localTime);

No importa lo que haga, la hora siempre sale a la hora UTC. Vivo en Houston, así que sé que la zona horaria es el problema. He seguido el código en el enlace, pero parece que puedo obtener la hora local. ¿Qué estoy haciendo mal?

Brian Scroggins
fuente

Respuestas:

239

Para convertir la hora UTC a Local, debe usar moment.local().

Para más información ver documentos

Ejemplo:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

console.log(date); // 2015-09-13 03:39:27

var stillUtc = moment.utc(date).toDate();
var local = moment(stillUtc).local().format('YYYY-MM-DD HH:mm:ss');

console.log(local); // 2015-09-13 09:39:27

Manifestación:

var date = moment.utc().format();
console.log(date, "- now in UTC"); 

var local = moment.utc(date).local().format();
console.log(local, "- UTC now to local"); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

axon
fuente
16
no funcionó para mí, el tiempo todavía está 5 horas por delante de mi navegador, lo cual es correcto
Brian Scroggins
Si momentjs conoce la zona horaria local, ¿hay alguna forma de recuperarla o es necesario moment.tz.guess () para hacer esto?
jEremyB
@jEremyB, moment().format('Z')y moment().format('ZZ')puedo ayudarte. Además, eche un vistazo a (new Date()).getTimezoneOffset()tal vez sea suficiente para su caso
axon
@brianScroggins, asegúrese de no olvidar .utc(date). En la primera parte, la línea que var local = ...no la tiene puede ser engañosa.
Jocelyn
62

Prueba esto:

let utcTime = "2017-02-02 08:00:13";

var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');
JAMZAD
fuente
3
Especificar la zona en la que se guardó funcionó para mí (esta respuesta). Además, descubrió que hace la vida más fácil si siempre guarda las cosas en utc y luego las formatea en el lado del cliente.
Juan Pablo Ugas
1
Esto funcionó en mi caso donde estamos ahorrando el tiempo en UTC en nuestra base de datos y solo mostrando la hora local en el cliente. Gracias.
Alex Ehlert
18
let utcTime = "2017-02-02 08:00:13.567";
var offset = moment().utcOffset();
var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");

Prueba este JsFiddle

Abdur Rahim
fuente
2
Esto funciona muy bien, pero ¿por qué .local () no devuelve el mismo resultado?
Steve
este violín devuelve el siguiente resultado en mi computadora: 02/02/2017 8:00 AM (hora UTC) 02/02/2017 10:00 AM (hora local) 02/02/2017 9:00 AM (hora local de otra manera )
Steve
3

Nota: actualice el formato de fecha en consecuencia.

Formato de fecha

   __formatDate: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('D-MMM-Y');
   }

Formato de hora

  __formatTime: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('HH:mm');
  },
Fung LAM
fuente
3

Para convertir UTC a hora local

let UTC = moment.utc()
let local = moment(UTC).local()

O quieres obtener directamente la hora local

let local = moment()

var UTC = moment.utc()
console.log(UTC.format()); // UTC time

var cLocal = UTC.local()
console.log(cLocal.format()); // Convert UTC time

var local = moment();
console.log(local.format()); // Local time
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Brady Huang
fuente
0

He creado una función que convierte todas las zonas horarias en hora local.

Requisitos:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"
Rohit Parte
fuente