Я уже некоторое время бьюсь над этим вопросом. Я пытаюсь преобразовать эпоху в объект даты. Эпоха передается мне в UTC. Всякий раз, когда вы передаете new Date()
эпоху, предполагается, что это локальная эпоха. Я пробовал создать объект UTC, затем использовать setTime()
, чтобы настроить его на нужную эпоху, но единственный метод, который кажется полезным, это toUTCString()
, а строки мне не помогают. Если я передаю эту строку в новую дату, она должна заметить, что это UTC, но она этого не делает.
new Date( new Date().toUTCString() ).toLocaleString()
Следующей попыткой была попытка получить разницу между локальной текущей эпохой и текущей эпохой UTC, но и это мне не удалось.
new Date( new Date().toUTCString() ).getTime() - new Date().getTime()
Это дает только очень маленькую разницу, меньше 1000, то есть в миллисекундах.
Какие-нибудь предложения?
Я думаю, что есть более простое решение-установить начальную дату в эпоху и добавьте мирового единиц. Скажем, у вас есть эпоха мирового ВАР хранится в секундах. Как насчет 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);
д
Сейчас свидание (в моем часовом поясе) установлен в Пятница 13 февраля 2009 18:31:30 по Гринвичу-0500 (ЭСТ)
Времени в секунды * от Января. 1, 1970. дата.возвращает методов 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;
}
Для преобразования ток-время в [МС] в 24-часовом формате. Вам может потребоваться указать параметр выкл 12-hour формат.
в
$ 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
Примечание: использование Ан-ГБ` здесь, это просто (случайный) выбор места, используя 24-часовой формат, это не ваш часовой пояс!
Дополнение к выше ответ по @djechlin
d = '1394104654000';
new Date(parseInt(d));
преобразует время в человекопонятную дату. Просто Дон'т забыть, что типа времени эпохи должно быть целым числом.
Вы просто хотите преобразовать строку 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);
Самое простое решение Я'вэ нашел это:
var timestamp = Date.now(), // returns milliseconds since epoch time
normalisedTime = new Date(timestamp);
Заметьте, это не'т у * 1000
в конце `новая дата(дата) заявления, так как это (для меня во всяком случае!) всегда кажется, выдают неверную дату, т. е. вместо того, чтобы дать в 2019 году он дает год как 51015, так что просто имейте это в виду.
Если вы предпочитаете решить временные метки и преобразования даты и времени в формате UTC и местным временем без библиотеки moment.js взгляните на параметр ниже.
Для приложений, которые используют UTC метки времени, вам может понадобиться, чтобы показать дату в браузере с учетом местного часового пояса и перехода на летнее время, когда это применимо. Редактирование даты в разных перехода на летнее время, хоть в тот же пояс может быть сложно.
"Число" и "дата" расширения ниже позволяют показать и получить дату в часовой пояс отметок. Например, предположим, вы находитесь в Ванкувере, при редактировании даты в июле или в декабре, это может означать, что вы редактируете дату в PST или ФДТ.
Я рекомендую вам проверить фрагмент кода ниже, чтобы проверить это решение.
Преобразование миллисекунд
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>
в
Времени (т. е. времени эпохи Unix) - это почти всегда число секунд, истекших с 1 января 1970 00:00:00 (время UTC), а не количество мс что ответы на некоторые вопросы здесь уже подразумевается.
https://en.wikipedia.org/wiki/Unix_time
Поэтому, если вам дали значение эпохи Unix время он, вероятно, будет в секундах, и будет выглядеть что-то вроде 1547035195
. Если вы хотите сделать это читаемым для человека в JavaScript, вы должны преобразовать значение в миллисекундах, и передать это значение в дата(значение)
конструктора, например:
const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();
Вы Don'т должны сделать д'.setUTCMilliseconds(0)
шаг в принятый ответ, потому что дата на JavaScript (значение)
конструктор берет мирового значение в миллисекундах (а не по местному времени).
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax
Также обратите внимание, что вы должны избегать использования дата(...)
конструктор, который принимает строковое представление даты и времени, это не рекомендуется (см. ссылку выше).
EDIT
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());
EDIT исправлено
@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();
}
Учитывая, что у вас есть 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