новая дата (год, месяц, дата) в узле js автоматически преобразуется в часовой пояс UTC

    var dateInCST; //Getting CST date as input.

    /*Triming the time part and retaining only the date.*/
    var onlyDateInCST = new Date(dateInCST.getUTCFullYear(), dateInCST.getUTCMonth(), dateInCST.getUTCDate()); 

    console.log(onlyDateInCST);

Я нахожусь в +5:30, то есть в часовом поясе IST.

Во время создания даты, указав год, месяц и дату, узел js обрабатывает ее как IST и автоматически вычитает -5: 30.

Node js автоматически конвертирует дату в UTC, считая, что дата находится в часовом поясе сервера. Но в браузере я получаю правильную дату CST без времени.

Пример :

var today = new Date(2017, 2, 7);
console.log(today);

Дата должна быть 2017-03-07T00: 00: 00.000Z. Но node js вычитает разницу часовых поясов сервера между UTC, т.е. +5: 30 от этой даты, и объект даты становится 2017-03-06T18: 30: 00.000Z

Почему приведенный выше код в Node js отличается от браузера. Какое-либо обходное решение для этого?

Редактировать :

var date = new Date();
function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
console.log(date);
console.log(createDateAsUTC(date));

Вывод NodeJs:

2017-03-08T12:28:16.381Z

2017-03-08T17:58:16.000Z

Вывод в браузере:

8 марта 2017 г., среда, 17:58:17 GMT + 0530 (индийское стандартное время)

Ср, 8 марта 2017 г., 23:28:17 GMT + 0530 (индийское стандартное время)

Существует разница между поведением Node js и браузером. Время на сервере (местное) было 17:58.

В чем разница между новой датой (?,?,?,?,?,?) И новой датой (Date.UTC (?,?,?,?,?,?))?


person Ashis Jena    schedule 06.03.2017    source источник
comment
Что вы получите, если сделаете console.log(dateInCST);? Вы получаете ту же дату, что и отправляете?   -  person Anthony C    schedule 06.03.2017
comment
Это зависит от часового пояса сервера, если он установлен на UTC, он всегда будет отображаться в дате и времени в часовом поясе UTC, аналогично браузер также ведет себя таким же образом (получает часовой пояс из ОС)   -  person Pavan Kumar Jorrigala    schedule 06.03.2017
comment
@PavanKumarJorrigala Я запускаю это в локальной системе. Часовой пояс моей системы - IST, т.е. +5:30. Я дал более подробную информацию в вопросе.   -  person Ashis Jena    schedule 07.03.2017
comment
Вы можете посмотреть _1 _.   -  person robertklep    schedule 07.03.2017
comment
Невозможно создать переменную типа dateInCST, используя только объект Date. Объект Date для внутреннего использования всегда является UTC и использует местный часовой пояс для преобразований ... Вы можете сделать это с помощью moment.js, но не сырой Date.   -  person Matt Johnson-Pint    schedule 07.03.2017
comment
@MattJohnson DateInCST - это не что иное, как вычитание -06: 00 или -05: 00 часов из dateInUTC. Хотя часовой пояс не будет в CST, но dateInCST представляет час и дату CST.   -  person Ashis Jena    schedule 08.03.2017
comment
Эта техника называется сменой эпох. Он работает надежно только в том случае, если вы очень строго относитесь к использованию только функций на основе UTC. Если вы попытаетесь сместить местное время, при переходе на летнее время в местном часовом поясе возникнут ошибки. Будьте осторожны - здесь драконы. :)   -  person Matt Johnson-Pint    schedule 08.03.2017


Ответы (4)


Nodejs представлен в формате ISO 8601

Z - обозначение зоны для нулевого смещения UTC. «09:30 UTC» поэтому представлено как «09: 30Z» или «0930Z».

В твоем случае

var today = новая дата (2017, 2, 7);

2017-03-06T18:30:00.000Z Это действительно так, потому что оно представлено в формате UTC.

Может быть, формат даты по умолчанию в nodejs - yyyy-mm-ddThh:mm:ss.fffZ, если вы измените его на yyyy-mm-ddThh:mm:ss.fffZ+|-hh:mm, он будет отображаться как 2017-03-07T00:00:00.000+05:30


Обновлять

Я использовал ту же дату и часовой пояс, что и ваш. На моем компьютере формат ISO 8601 не отображается, он отображается только с помощью метода toISOString().

var today = new Date(2017, 2, 7);
console.log(today); --> Tue Mar 07 2017 00:00:00 GMT+0530 (India Standard Time)
console.log(today.toISOString()); --> 2017-03-06T18:30:00.000Z

для репликации добавил moment.js

var today = new Date(2017, 2, 7);
console.log(moment(today).format()); --------> 2017-03-07T00:00:00+05:30
console.log(moment(today).utc().format()); --> 2017-03-06T18:30:00Z
person Pavan Kumar Jorrigala    schedule 07.03.2017
comment
Как изменить формат по умолчанию в Node js на yyyy-mm-ddThh: mm: ss.fffZ + | -hh: mm? - person Ashis Jena; 08.03.2017

Если вам нужно то же самое, что и в браузере, просто преобразуйте его в строку, вызвав метод toString, как показано ниже. Тогда вы получите правильную дату, как вы и ожидали.

(новая дата ()). toString ();

person Rajasekhar Kunati    schedule 03.08.2017

Когда вы создаете объект Date (независимо от того, в браузере или в Node.js), экземпляр создается с датой, которая интерпретируется как локальная для текущего часового пояса. См. второе примечание в документации MDN.

Если вы хотите сразу же создать дату в формате UTC, вы должны использовать

new Date(Date.UTC(...))

Date.UTC() имеет ту же семантику ввода, что и new Date().

Также следует отметить, что печать экземпляра даты на консоли приведет к тому, что дата будет представлена ​​как временная метка ISO, которая всегда находится в формате UTC. Вы можете проверить объект даты, напечатав date.toString() или date.toLocaleString(), который покажет дату в текущем часовом поясе.

person Robert Rossmann    schedule 07.03.2017

Вы можете добавить строку «UTC» в конец строки даты, переданной в new Date (), например:

var date= new Date("2019-2-21 UTC")

теперь дата var будет в местном времени

var d = new Date();
var date = new Date(d + 'UTC');
console.log(d)// date in UTC 
console.log(date)// date in localtime

`

person Hanz Haneefa    schedule 21.02.2019
comment
По крайней мере, возвращает недопустимую дату в Safari. См. Почему Date.parse дает неверные результаты? < / а> - person RobG; 21.11.2019