Ты говоришь:
Время сбрасывается на время 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), его настройка для каждого часового пояса клиента означает, что он представляет другой момент времени для каждого клиента с разным смещением часового пояса.
person
RobG
schedule
06.06.2017
tempDate.toUTCString()- person evolutionxbox   schedule 06.06.2017