Конвертировать UTC 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, который находится в миллисекундах.
какие предложения?
12 ответов:
Я думаю, что у меня есть более простое решение-установить начальную дату в эпоху и добавить единицы UTC. Скажем, у вас есть UTC epoch var, сохраненный в секундах. Как насчет
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)
это легко,
new Date()
просто занимает миллисекунды, например,new Date(1394104654000) > Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
и просто для журналов, я сделал это с помощью момент.js библиотека, которую я использовал для форматирования в любом случае.
moment.utc(1234567890000).local() >Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
время в секунд С января. 1, 1970.
date.getTime()
возвращает МС С января. 1, 1970, so.. если у вас есть временная метка эпохи, преобразуйте ее в временную метку 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; }
function ToLocalDate (inDate) { var date = new Date(); date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset()); return date; }
вы просто просите преобразовать строку 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);
преобразовать текущее время в [МС] в 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-часового формата, это не ваш часовой пояс!
редактировать
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());
редактировать основные
если вы предпочитаете разрешать преобразования временных меток и дат из и в UTC и местное время без библиотек, таких как moment.js, взгляните на вариант ниже.
для приложений, использующих временные метки UTC, вам может потребоваться показать дату в браузере с учетом местного часового пояса и летнего времени, когда это применимо. Редактирование даты, которая находится в другое летнее время, даже если в том же часовом поясе может быть сложно.
The
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>
@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(); }