Преобразование миллисекунд в объект даты UTC с часовым поясом UTC

1

Я пытаюсь преобразовать миллисекунды в объект даты UTC, как показано ниже:

var tempDate = new Date(1465171200000);
// --> tempDate = Mon Jun 06 2016 05:30:00 **GMT+0530 (India Standard Time)** {}

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(),  tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());
//--> _utcDate = Mon Jun 06 2016 00:00:00 **GMT+0530 (India Standard Time)** {}

Время сбрасывается на время UTC, но Часовой пояс по-прежнему идет как GMT + 0530 (стандартное время Индии). Есть ли какой-либо подход с уверенным выстрелом для преобразования миллисекунд в объект даты UTC с часовым поясом UTC?

Теги:
date
utc
gmt
milliseconds

3 ответа

2

Цитата из этого ответа (который я предлагаю вам прочитать полностью):

В объекте Date нет часового пояса или строкового формата. Когда используются различные функции объекта Date, локальный часовой пояс компьютера применяется к внутреннему представлению.

Поскольку часовой пояс не сохраняется в объекте Date, его невозможно установить.

Я вижу два варианта:

во-первых, использовать библиотеку (как указано в ответе выше). Довольно популярно сейчас Moment.js

второй (чистый JavaScript - если это жизнеспособное решение в вашем контексте):

Сделайте "математику времени" в своем местном часовом поясе.

Когда вы будете готовы к использованию toUTCString() для использования UTC.

Конечно, у вас будет строка, так как это позволит вам хранить часовой пояс до тех пор, пока значение времени даты.

Поскольку теперь вы не сможете управлять временем даты как объекта Date это должен быть последний шаг.

var tempDate = new Date(1465171200000);
// Mon Jun 06 2016 05:30:00 GMT+0530

// Do your date time math here
// using the Date object methods

var utcDateAsString = tempDate.toUTCString();
// Mon Jun 06 2016 00:00:00 GMT
  • 0
    Встроенный синтаксический анализатор требуется (начиная с ECMAScript 2015?) Для правильного анализа того, что генерируют связанные методы toString и toUTCString , но только для каждой реализации.
1

Если вы создаете Date из Number, то учитывается локальный часовой пояс. Но если вы хотите посмотреть, что означает временная метка с часами, исправленными для UTC, вы можете использовать помощник как таковой:

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

Использование:

var date = (1465171200000).toUTCDate();
1

Ты говоришь:

Время сбрасывается на время UTC, но Часовой пояс по-прежнему идет как GMT + 0530 (стандартное время Индии). Есть ли какой-либо подход с уверенным выстрелом для преобразования миллисекунд в объект даты UTC с часовым поясом UTC?

Но я думаю, вы неправильно понимаете, что происходит. Когда вы передаете номер конструктору Date, как в:

new Date(1465171200000)

предполагается, что она равна миллисекундам с эпохи ECMAScript (1970-01-01T00: 00: 00Z), поэтому объект Date создается с этим значением в качестве его внутреннего значения времени. Таким образом, объекты Date по сути являются UTC.

Когда вы пишете это в строку, внутренняя строка строки, читаемая человеком, генерируется на основе настройки часового пояса хоста, поэтому вы видите дату для GMT + 0530 (то есть настройку часового пояса вашей системы). Сам объект Date не имеет часовой пояс, он всегда UTC.

Когда вы затем используете значения UTC для создания "локальной" даты, используя:

new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...)

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

var d = new Date(1465171200000);
d.setMinutes(d.getMintues() + d.getTimezoneOffset());

который только показывает немного более четко, что происходит. Обратите внимание, что смещения часовых поясов ECMAScript находятся в минутах и имеют противоположный смысл для UTC, то есть они являются отрицательными (-) для восточного и позитивного (+) для запада. Таким образом, смещение UTC + 05: 30 представлено как -330, и вам нужно добавить его в "сдвинуть" дату, а не вычесть ее.

var tempDate = new Date(1465171200000);

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(),  tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());

console.log('Direct conversion to Date\ntempDate: ' + tempDate.toString());
console.log('Adjusted using UTC methods\n_utcDate: ' + _utcDate.toString());

tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset());
console.log('Adjusted using timezoneOffset\ntempDate: ' + tempDate.toString());

Однако я не могу понять, почему вы хотите сделать это. 1465171200000 представляет определенный момент времени (2016-06-06T00: 00: 00Z), корректируя его для каждого часового пояса клиента, означает, что он представляет собой другой момент времени для каждого клиента с другим смещением часового пояса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню