it-swarm.com.ru

Конвертировать UTC Epoch в местную дату

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

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

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

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

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

Какие-либо предложения?

219
Shane Reustle

Я думаю, что у меня есть более простое решение - установить начальную дату в эпоху и добавить единицы измерения UTC. Скажем, у вас есть переменная UTC Epoch, хранящаяся в секундах. Как насчет 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)

395
user1030503

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

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

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

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
29
Gus
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
16
chris

Время эпохи в секундах с 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;
   }
15
logic8

Вы просто просите преобразовать строку 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);
3
ZagNut

Чтобы преобразовать текущее время эпохи в [мс] в 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-часового формата, это не ваш часовой пояс!

2
not2qubit

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

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

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

1
Sarvar Nishonboev

Если вы предпочитаете разрешать временные метки и преобразования дат из и в UTC и местное время без библиотек, таких как moment.js, взгляните на опцию ниже.

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

Приведенные ниже расширения Number и Date позволяют отображать и получать даты в часовом поясе временных меток. Например, предположим, что вы находитесь в Ванкувере, если вы редактируете дату в июле или декабре, это может означать, что вы редактируете дату в PST или PDT.

Я рекомендую вам проверить фрагмент кода ниже, чтобы проверить это решение.

преобразования в миллисекундах

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;
};

Конверсии из дат

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

Использование

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

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

Убедитесь сами

// 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);
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>

<div class="ui container">
  <p></p>
  
  <h3>Milliseconds to local date</h3>
  <input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
  <em id="m-to-local-display">Set a value</em>

  <h3>Milliseconds to UTC date</h3>
  <input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
  <em id="m-to-utc-display">Set a value</em>
  
  <h3>Date to milliseconds in UTC</h3>
  <input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
  <input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
  <input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
  <input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
  <input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
  <input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
  <button id="date-to-utc-button">Convert</button>
  <em id="date-to-utc-display">Set the values</em>
  
</div>

1
Darlesson

ПРАВКА

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());

РЕДАКТИРОВАТЬисправлено

1
Amjad Masad

@ Амджад, хорошая идея, но плохо реализована. Пытаться

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();
}
0
Walf

Учитывая, что у вас есть Epoch_time

// 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
0
apurva.nandan

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

var timestamp = Date.Now()    
var normalisedTime = new Date(timestamp)

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

0
Rob P

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

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

Следовательно, если вы получили значение времени Unix Epoch, оно, вероятно, будет в секундах и будет выглядеть примерно как 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(...), который принимает строковое представление даты-времени, это не рекомендуется (см. Ссылку выше).

0
garryp