Преобразование эпохи UTC в локальную дату

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

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

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

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

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

Любые предложения?

Ответ 1

Я думаю, что у меня более простое решение - установите начальную дату в эпоху и добавьте 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)

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

Ответ 5

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

Ответ 6

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

Ответ 7

Добавление к вышеуказанному ответу @djechlin

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

ИЗМЕНИТЬ

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

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

Ответ 12

Если вы предпочитаете разрешать временные метки и даты, начиная с и до 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>

Ответ 13

@Amjad, хорошая идея, но плохо реализована. Попробуйте

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

Ответ 14

Учитывая, что у вас есть 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

Ответ 15

новая дата (1542112948 * 1000); работал на меня

Ответ 16

Сначала преобразуйте его в String, а затем замените текст часового пояса.

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