Вопрос по date, javascript – Получение текущей даты в миллисекундах (UTC) (без использования строк)

14

Ну, вы можете подумать, что этот вопрос уже задавался, но я думаю, что это не так. Решения, о которых я все читал, имели эту «головоломку». техника (какgetUTCMonth() + getUTCMinutes + ...). But as I only want to compare the elapsed seconds between two UTC (!) dates, this does not apply.

Как всем известно, вы можете получить текущую (не UTC) дату:

var d = new Date();
var t_millis = d.getTime();

Но это НЕ то, что я хочу. Я бы хотел, чтобы текущая системная дата была в UTCand в миллисекундах, так что не связывайтесь со строками вообще. AFAIK переменнаяt_millis будет содержать значение миллисекунды текущей отметки времени в GMT, а не в формате UTC. (Посколькуd также в GMT.Unless getTime () выполняет своего рода неявное преобразование часового пояса, т.е. е. добавление смещенияBEFORE выдает миллисекунды, но я никогда об этом нигде не читал)

Так нет ли другого способа, кроме добавления смещения к значению времени? Я отчаянно скучаю по такой функции, какgetUTCTimeMillis() известен из других языков.

Да, UTC - это время по Гринвичу ... Я должен был сказать "местное время". Виноват. Когда я имею в виду «GMT», я обычно имею в виду противоположность UTC, т.е. е. местное время, показанное по смещению GMT +/-, в то время как UTC = константа. syntaxerror
Я не понимаю. УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯявляетс GMT, во всех отношениях. Andrew Leach

Ваш Ответ

5   ответов
29

Это старый вопрос, но ради новых посетителей здеПРАВИЛЬНЫ ответ

Date.now();

Возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC

19

его часового пояса. То есть на планете Земля нет часовых поясов, которые отличались бы друг от друга на количество миллисекунд больше нуля. (Они могут отличаться на целое число часов или даже минут, но не секунд или миллисекунд.)

Тем не менее, ценность, которую вы получаете отgetTime() являетс UTC-относительная временная метка. Если два веб-браузера в разных точках земного шара создают объект Date одновременно, они оба получат одинаковое значение от.getTime() (при условии, что часы синхронизированы, что, конечно, крайне маловероятно).

Here: 1338585185539 Это временная метка, которую я только что получил из своего браузера. Я в Остине, штат Техас, и сейчас 4:13 дня (так что отметка времени будет немного раньше). Подключите его к экземпляру Date на вашем компьютере и посмотрите, что он говорит.

(редактироват - для потомков эта временная метка с 1 июня 2012 года.)

Благодарность! Да, я понимаю это сейчас. Так что, если мы уверены, что объект Date определенно является значением GMT, мы можем логически заключить, что getTime () должен незаметно выполнять преобразование GMT в UTCд подсчет миллисекунд. syntaxerror
Извините, но я не согласен с этим. Действительно, время, прошедшее с 1970 года в одном часовом поясе, идентично времени в любом другом часовом поясе, но UTC - это нечто другое. Почему у вас так много функций, параллельных стандартным функциям Date, в названии которых указано UTC? Вот объяснение, почему UTC почти такой же, как GMT, но не совсем: Sandman
@ Тео да? Функции даты в формате UTC присутствуют, потому что все не-UTC API сообщают время / дату относительно местного часового пояса. Pointy
Извините за неполное сообщение (я пытался дать ссылку на абзац в Википедии). Да, но есть две вещи, с которыми я на самом деле не согласен, надеюсь, я не ошибаюсь: getTime () является меткой времени относительно UTC и что преобразование GMT-в-UTC (или любое преобразование) должно быть неявным выполняется перед вычислением getTime () Sandman
getTime () - относительное значение часового пояса, а не относительное значение UTC (вот почему оно везде одинаковое), а getTime () вообще не конвертирует, верно? Если вам нужна какая-либо синхронизация между часовыми поясами (поэтому я подозреваю, что этот вопрос был задан в первую очередь), вам понадобится общая ссылка UTC. Если вы хотите измерять только прошедшее время в вашем местном часовом поясе, это не имеет значения, вы можете использовать getTime () Sandman
5

как насчет

var now = new Date();
var utc_now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
console.log('UTC: ' + utc_now) // correct UTC time but wrong timezone!
console.log('UTC (in ms): ' + utc_now.getTime())
Просто к сведению, что вы можете оставить часть UTC. (IE now.getFullYear () вместо now.getUTCFullYear ()). Ryan Q
@ RyanQ, если он сделает то, что будет разница междуnow а такжеutc_now? В этом весь смысл. Odys
5

Я использовал эту функцию для решения проблемы.

function getUTCNow()
{
    var now = new Date();
    var time = now.getTime();
    var offset = now.getTimezoneOffset();
    offset = offset * 60000;
    return time - offset;
}
Функция getTime возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 в часовом поясе клиента.getTimezoneOffset смещение возврата в минутах между часовым поясом клиента и UTC.offset = смещение * 60000; эта операция преобразует минуты в миллисекунды. Вычитая смещение, выведите количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC.
Вот одна строка для текущих браузеров:Date.nowUTC=()=>(d=>d.getTime()-(d.getTimezoneOffset()*6e4))(new Date()) Mr. Polywhirl
Функция getTime возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 в часовом поясе клиента. getTimezoneOffset возвращает смещение в минутах между часовым поясом клиента и UTC. смещение = смещение * 60000; эта операция преобразует минуты в миллисекунды. вычитая смещение, мы получаем количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC. Blacknet
Я не думаю, что это правильно. Согласно с MDN: getTime() always uses UTC for time representation. For example, a client browser in one timezone, getTime() will be the same as a client browser in any other timezone.. Кроме того, они говорят, что возвращаемое значение равноA number representing the milliseconds elapsed between 1 January 1970 00:00:00 UTC and the given date. Н количество миллисекунд в часовом поясе клиента. Noah Allen
Это неправильно, getTime возвращается в UTC! jolumg
1

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

Опция ниже делает именно это.

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

Может использоваться как в:

var date = new Date();
var timestamp = date.getUTCTime();

Похожие вопросы