Node.js новая дата не отражает часовой пояс TZ var от .env - PullRequest
0 голосов
/ 04 февраля 2019

только что наткнулся на одну забавную проблему в Node.js и MacOs - в основном, если вы запускаете экземпляр узла с установленной переменной часового пояса в файле .env, переменная TZ, а ваш локальный компьютер находится в другом часовом поясе, создание даты - f ** d возможно в виде сусла, так что:

Часовой пояс установлен правильно

Но при создании новой даты часовой пояс не отражается


см. этот пример (моя машина находится в CET, часовой пояс Европа / Прага):

~/
11:13 (CET) $ node
new Date()
2019-02-04T10:30:23.053Z # Europe/Prague
new Date().getTimezoneOffset()
-60 # Europe/Prague
.exit

против.установите часовой пояс в TZ env

✔ ~/
11:30 (CET) $ TZ=America/New_York node
new Date()
2019-02-04T10:31:40.968Z # 10:31! :D
new Date().getTimezoneOffset()
300 # America/New_York!

Таким образом, тогда невозможно создать правильную дату, поскольку все JS-библиотеки, подобные моменту, используются в объекте Date конца.Я считаю, что вы никогда не должны устанавливать TZ var при запуске сервера Node.js, я что-то пропускаю?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Ваши примеры выглядят правильно для меня.Я подозреваю, что ваше представление о том, как компьютер отслеживает и показывает, время перевернуто.Ваши комментарии означают, что вы думаете, TZ используется для получения UTC из внутренних часов компьютера.Это не так.

Внутренне ваш Mac использует время UTC.Ваш Mac не"в CET".Это «в UTC со значением по умолчанию TZ CET».TZ контролирует, как местное время получается из базового UTC, когда требуется локальная временная метка или смещение часового пояса.Если вы измените TZ, то местные временные метки будут показаны в новом часовом поясе, но это не повлияет на внутреннее время компьютера в формате UTC.

Специально для вашего примера new Date() даст вам объект Date, представляющийтекущее времяСтроковое представление по умолчанию для объекта Date - это время UTC.В вашем примере вы можете видеть, что это время, показанное как результат вызова new Date():

    2019-02-04T10:30:23.053Z # Europe/Prague

, является временем UTC, потому что его часовой пояс отображается как Z, указывая UTC.(Можно помнить, что это означает, что «Z» означает «Смещение нуля от UTC». Этот формат иногда называют «зулусским» временем, поскольку «Зулу» является кодовым словом фонетического алфавита ИКАО для «Z».) Если ваш комментарийутверждает, что это локальная европейская / пражская временная метка, тогда комментарий неправильный.

Результат второго new Date():

    2019-02-04T10:31:40.968Z # 10:31! :D

также отображается в UTC и составляет околона минуту позже первого результата.Неважно, что TZ для этого процесса отличается, потому что TZ не влияет на временные метки UTC.

Чтобы посмотреть местное время, которое рассчитывается путем применения настройки TZ к UTCвремя, полученное с часов компьютера, используйте метод toLocaleString для объекта Date.Если вы повторите этот тест, используя этот метод, вы увидите что-то вроде этого:

    $ env TZ=Europe/Prague node 
    > now = new Date()
    2019-02-04T20:26:40.408Z
    > now.toLocaleString()
    'Mon Feb 04 2019 21:26:40 GMT+0100 (CET)'

    $ env TZ=America/New_York node 
    > now = new Date()
    2019-02-04T20:27:12.438Z
    > now.toLocaleString()
    'Mon Feb 04 2019 15:27:12 GMT-0500 (EST)'

, что выглядит вполне разумно.

Кстати, Node или JavaScript, здесь нет ничего необычного,Так все работает.Например, команда date:

    $ env TZ=Europe/Prague date
    Mon Feb  4 21:54:49 CET 2019

    $ env TZ=America/New_York date
    Mon Feb  4 15:54:51 EST 2019
0 голосов
/ 04 февраля 2019

Вы можете решить вашу проблему с помощью moment-timezone пакета узла.приведенный ниже код может помочь вам решить вашу проблему.

const moment = require('moment-timezone')

function convertDate(dateInUTCFormat) { 
    return new Promise((resolve, reject) => { 
        var dec = moment(dateInUTCFormat);
        var normalDate = dec.tz('Asia/Kolkata').format('YYYY-MM-DD');  // GMT +5:30 (India)
        resolve(normalDate);
    }) 
}

Также вам нужно передать полученный формат даты в формате UTC, например, для функции 2019-02-04T10:30:23.053Z в convertDate и передать ваш часовой пояс по мере прохождения.мой часовой пояс Asia/Kolkata.Пусть это поможет вам найти решение.

...