Momento Js UTC para Hora Local

145

Estou tentando converter a hora UTC para a hora local. Eu tenho seguido este exemplo neste link: http://jsfiddle.net/FLhpq/4/light/ . Não consigo obter a saída local correta. Por exemplo, se são 10:30 aqui, em vez de ficarem 10:30 doentes, 15:30. Aqui está o meu 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);

Não importa o que eu faça, a hora sempre sai no horário UTC. Eu moro em Houston, então eu sei que o fuso horário é o problema. Segui o código no link, mas parece que é possível obter a hora local. O que estou fazendo de errado?

Brian Scroggins
fonte

Respostas:

239

Para converter a hora UTC em Local, você precisa usar moment.local().

Para mais informações, consulte documentos

Exemplo:

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

Demo:

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>

axônio
fonte
16
não funcionou para mim, o tempo ainda é de 5 horas à frente do meu browers tempo que é correto
brian Scroggins
se momentjs estiver ciente do fuso horário local, existe uma maneira de recuperá-lo ou é necessário moment.tz.guess () para fazer isso?
jEremyB
@jEremyB, moment().format('Z')e moment().format('ZZ')pode ajudá-lo. Além disso, dê uma olhada (new Date()).getTimezoneOffset()talvez seja o suficiente para você caso
axônio
@brianScroggins, não se esqueça .utc(date). Na primeira parte, a linha que var local = ...não a possui pode ser enganosa.
Jocelyn
62

Tente o seguinte:

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

var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');
JAMZAD
fonte
3
A especificação da zona em que foi salva funcionou para mim (esta resposta). Além disso, descobriu que isso facilita a vida se você sempre salvar as coisas em utc e depois em formato no lado do cliente.
Juan Pablo Ugas
1
Isso funcionou no meu caso, onde estamos economizando o tempo no UTC em nosso banco de dados e exibindo apenas o horário local no cliente. Obrigado.
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");

Experimente este JsFiddle

Abdur Rahim
fonte
2
Isso funciona muito bem, mas por que .local () não retorna o mesmo resultado?
11119 Steve Steve
este violino retorna o seguinte resultado no meu computador: 02/02/2017 08:00 (horário UTC) 02/02/2017 10:00 (horário local) 02/02/2017 09:00 (horário local de outra maneira) )
Steve
3

Nota: atualize o formato da data adequadamente.

Formatar Data

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

Formatar Hora

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

Para converter o UTC para a hora local

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

Ou você deseja obter diretamente a 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
fonte
0

Eu criei uma função que converte todos os fusos horários em horário 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
fonte