Converta UTC Epoch em data local

Eu tenho lutado com isso um pouco agora. Eu estou tentando converter époch para um object de data. A época é enviada para mim na UTC. Sempre que você passa o new Date() uma época, ele assume a época local. Eu tentei criar um object UTC, em seguida, usando setTime() para ajustá-lo para a época adequada, mas o único método que parece útil é toUTCString() e seqüências de caracteres não me ajudam. Se eu passar essa string para uma nova data, ela deve perceber que é UTC, mas não.

 new Date( new Date().toUTCString() ).toLocaleString() 

Minha próxima tentativa foi tentar obter a diferença entre a época atual local e a época atual do UTC, mas também não consegui.

 new Date( new Date().toUTCString() ).getTime() - new Date().getTime() 

Está me dando apenas pequenas diferenças, abaixo de 1000, o que é em milissegundos.

Alguma sugestão?

Eu acho que tenho uma solução mais simples – definir a data inicial para a época e adicionar unidades UTC. Digamos que você tenha um período UTC var armazenado em segundos. Como cerca de 1234567890 . Para converter isso em uma data apropriada no fuso horário local:

 var utcSeconds = 1234567890; var d = new Date(0); // The 0 there is the key, which sets the date to the epoch d.setUTCSeconds(utcSeconds); 

d é agora uma data (no meu fuso horário) definida como Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

É fácil, o new Date() leva apenas milissegundos, por exemplo

 new Date(1394104654000) > Thu Mar 06 2014 06:17:34 GMT-0500 (EST) 

E apenas para os logs, eu fiz isso usando a biblioteca Moment.js , que eu estava usando para formatação de qualquer maneira.

 moment.utc(1234567890000).local() >Fri Feb 13 2009 19:01:30 GMT-0430 (VET) 

O horário da date.getTime() está em segundos a partir de 1º de janeiro de 1970. date.getTime() retorna milissegundos a partir de 1º de janeiro de 1970, portanto, se você tiver um registro de data e hora de época, converta-o em timestamp de javascript multiplicando por 1000.

  function epochToJsDate(ts){ // ts = epoch timestamp // returns date obj return new Date(ts*1000); } function jsDateToEpoch(d){ // d = javascript date obj // returns epoch timestamp return (d.getTime()-d.getMilliseconds())/1000; } 
  function ToLocalDate (inDate) { var date = new Date(); date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset()); return date; } 

Você está apenas pedindo para converter uma string UTC em uma string “local”? Você poderia fazer:

 var utc_string = '2011-09-05 20:05:15'; var local_string = (function(dtstr) { var t0 = new Date(dtstr); var t1 = Date.parse(t0.toUTCString().replace('GMT', '')); var t2 = (2 * t0) - t1; return new Date(t2).toString(); })(utc_string); 

Para converter o tempo atual da época em [ms] para um período de 24 horas. Pode ser necessário especificar a opção para desativar o formato de 12 horas .

 $ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));" 2/7/2018, 19:35:24 

ou como JS:

 var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } )); // 2/7/2018, 19:35:24 console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } )); // 19:35:24 

Nota: O uso de en-GB aqui, é apenas uma escolha (aleatória) de um lugar usando o formato de 24 horas, não é o seu fuso horário!

EDITAR

 var utcDate = new Date(incomingUTCepoch); var date = new Date(); date.setUTCDate(utcDate.getDate()); date.setUTCHours(utcDate.getHours()); date.setUTCMonth(utcDate.getMonth()); date.setUTCMinutes(utcDate.getMinutes()); date.setUTCSeconds(utcDate.getSeconds()); date.setUTCMilliseconds(utcDate.getMilliseconds()); 

EDITAR fixo

Se você preferir resolver registros de data e hora e converter datas de e para UTC e hora local sem bibliotecas como moment.js, dê uma olhada na opção abaixo.

Para aplicativos que usam registros de data e hora UTC, talvez seja necessário mostrar a data no navegador, considerando o fuso horário local e o horário de verão, quando aplicável. Editar uma data que esteja em um horário de verão diferente, embora no mesmo fuso horário, possa ser complicado.

As extensões de Number e Date abaixo permitem que você mostre e obtenha datas no fuso horário dos timestamps. Por exemplo, digamos que você esteja em Vancouver, se estiver editando uma data em julho ou dezembro, isso pode significar que você está editando uma data em PST ou PDT.

Eu recomendo que você verifique o Snippet abaixo para testar esta solução.

Conversões de milissegundos

 Number.prototype.toLocalDate = function () { var value = new Date(this); value.setHours(value.getHours() + (value.getTimezoneOffset() / 60)); return value; }; Number.prototype.toUTCDate = function () { var value = new Date(this); value.setHours(value.getHours() - (value.getTimezoneOffset() / 60)); return value; }; 

Conversões de datas

 Date.prototype.getUTCTime = function () { return this.getTime() - (this.getTimezoneOffset() * 60000); }; 

Uso

 // Adds the timezone and daylight savings if applicable (1499670000000).toLocalDate(); // Eliminates the timezone and daylight savings if applicable new Date(2017, 6, 10).getUTCTime(); 

Veja você mesmo

 // Extending Number Number.prototype.toLocalDate = function () { var value = new Date(this); value.setHours(value.getHours() + (value.getTimezoneOffset() / 60)); return value; }; Number.prototype.toUTCDate = function () { var value = new Date(this); value.setHours(value.getHours() - (value.getTimezoneOffset() / 60)); return value; }; // Extending Date Date.prototype.getUTCTime = function () { return this.getTime() - (this.getTimezoneOffset() * 60000); }; // Getting the demo to work document.getElementById('m-to-local-button').addEventListener('click', function () { var displayElement = document.getElementById('m-to-local-display'), value = document.getElementById('m-to-local').value, milliseconds = parseInt(value); if (typeof milliseconds === 'number') displayElement.innerText = (milliseconds).toLocalDate().toISOString(); else displayElement.innerText = 'Set a value'; }, false); document.getElementById('m-to-utc-button').addEventListener('click', function () { var displayElement = document.getElementById('m-to-utc-display'), value = document.getElementById('m-to-utc').value, milliseconds = parseInt(value); if (typeof milliseconds === 'number') displayElement.innerText = (milliseconds).toUTCDate().toISOString(); else displayElement.innerText = 'Set a value'; }, false); document.getElementById('date-to-utc-button').addEventListener('click', function () { var displayElement = document.getElementById('date-to-utc-display'), yearValue = document.getElementById('date-to-utc-year').value || '1970', monthValue = document.getElementById('date-to-utc-month').value || '0', dayValue = document.getElementById('date-to-utc-day').value || '1', hourValue = document.getElementById('date-to-utc-hour').value || '0', minuteValue = document.getElementById('date-to-utc-minute').value || '0', secondValue = document.getElementById('date-to-utc-second').value || '0', year = parseInt(yearValue), month = parseInt(monthValue), day = parseInt(dayValue), hour = parseInt(hourValue), minute = parseInt(minuteValue), second = parseInt(secondValue); displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime(); }, false); 
  

Milliseconds to local date

Set a value

Milliseconds to UTC date

Set a value

Date to milliseconds in UTC

Set the values

@ Amjad, boa ideia, mas implementado mal. Experimentar

 Date.prototype.setUTCTime = function(UTCTimestamp) { var UTCDate = new Date(UTCTimestamp); this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate()); this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds()); return this.getTime(); } 

Considerando que você tem epoch_time disponível,

 // for eg. epoch_time = 1487086694.213 var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds var date_string = date.toLocaleString('en-GB'); // 24 hour format 

Primeiro, converta-o em String e, em seguida, substitua o texto do fuso horário.

 function convertUnixTime(time) { return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)",""); }