Конвертировать UTC Epoch в местную дату - PullRequest
239 голосов
/ 08 января 2011

Я боролся с этим немного сейчас. Я пытаюсь преобразовать эпоху в объект даты. Эпоха отправлена ​​мне в UTC. Всякий раз, когда вы проходите new Date() эпоху, она предполагает локальную эпоху. Я попытался создать объект UTC, затем с помощью setTime() настроить его на соответствующую эпоху, но единственный метод, который кажется полезным, - это toUTCString(), и строки мне не помогают. Если я передам эту строку в новую дату, он должен заметить, что это UTC, но это не так.

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

Моя следующая попытка состояла в том, чтобы попытаться выяснить разницу между локальной текущей эпохой и текущей эпохой UTC, но я также не смог ее получить.

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

Это дает мне очень небольшие различия, меньше 1000, то есть в миллисекундах.

Есть предложения?

Ответы [ 15 ]

417 голосов
/ 05 ноября 2011

Я думаю, у меня есть более простое решение - установить начальную дату для эпохи и добавить единицы измерения UTC. Скажем, у вас есть переменная эпохи UTC, сохраненная в секундах. Как насчет 1234567890. Чтобы преобразовать это в правильную дату в местном часовом поясе:

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 теперь дата (в моем часовом поясе) установлена ​​на Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

177 голосов
/ 07 марта 2014

Это просто, new Date() просто занимает миллисекунды, например

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
29 голосов
/ 19 октября 2012

И только для журналов я сделал это с помощью библиотеки Moment.js , которую я в любом случае использовал для форматирования.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
16 голосов
/ 10 сентября 2012

Время эпохи в секундах с 1 января 1970 года. date.getTime() возвращает миллисекунды с 1 января 1970 года, поэтому ... если у вас есть отметка времени эпохи, преобразуйте это метка времени javascript, умноженная на 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;
   }
16 голосов
/ 28 января 2012
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
3 голосов
/ 17 января 2019

Самое простое решение, которое я нашел, это:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

Обратите внимание, что в конце оператора new Date(timestamp) не указано * 1000, поскольку это (во всяком случае, для меня!) Всегда выдает неправильную дату, т. Е. Вместо того, чтобы указывать 2019 год, оно дает год как 51015, так что имейте это в виду.

3 голосов
/ 07 декабря 2018

В дополнение к приведенному выше ответу @ djechlin

d = '1394104654000';
new Date(parseInt(d));

преобразует время EPOCH в удобочитаемую дату.Только не забывайте, что тип времени EPOCH должен быть целым числом.

3 голосов
/ 06 сентября 2011

Вы просто хотите преобразовать строку UTC в "локальную" строку? Вы могли бы сделать:

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);
2 голосов
/ 09 января 2019

Время эпохи (т. Е. Время эпохи Unix) - это почти всегда число секунд , которое истекло с 1 января 1970 г. 00:00:00 (время UTC), а не число миллисекунд , которые подразумевали некоторые ответы здесь.

https://en.wikipedia.org/wiki/Unix_time

Поэтому, если вам было дано значение времени эпохи Unix, оно, вероятно, будет в секундах и будет выглядеть примерно так: 1547035195. Если вы хотите, чтобы этот человек читался в JavaScript, вам нужно преобразовать значение в миллисекунды и передать это значение в конструктор Date(value), например ::

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

Вам не нужно делать шаг d.setUTCMilliseconds(0) в принятом ответе, потому что конструктор JavaScript Date(value) принимает значение UTC в миллисекундах (не по местному времени).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

Также обратите внимание, что вам следует избегать использования конструктора Date(...), который принимает строковое представление даты-времени, это не рекомендуется (см. Ссылку выше).

2 голосов
/ 07 февраля 2018

Чтобы преобразовать текущее время эпохи в [мс] в 24-часовое время. Возможно, вам потребуется указать параметр отключить 12-часовой формат .

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

2/7/2018, 19:35:24

или как 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

Примечание: Использование en-GB здесь - это просто (случайный) выбор места с использованием 24-часового формата, это не ваш часовой пояс!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...