Конвертировать 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 ]

1 голос
/ 29 июля 2017

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

РЕДАКТИРОВАТЬ

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

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

0 голосов
/ 19 апреля 2018

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

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
0 голосов
/ 14 февраля 2017

Учитывая, что у вас есть 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 голосов
/ 28 сентября 2011

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

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...