Node.js - время сервера "ISO" против времени Unix вызывает разницу - PullRequest
0 голосов
/ 22 сентября 2018

В прошлом использование времени Unix, которое по определению относится к UTC, никогда не вызывало расхождений при разборе и / или трансляции времени между серверами.Тем не менее, я испытываю довольно неожиданное поведение, которое я не могу отладить для меня.

ЭТО НА ФАКТЕ ПРОИЗВЕДЕНО И ОЖИДАЕТСЯ НА ОБАХ СЕРВЕРАХ

let present = moment('2018.09.20', 'YYYY.MM.DD').tz('America/Toronto').toISOString()

-> '2018-09-20T04:00:00.000Z'

let utc_present = moment('2018.09.20', 'YYYY.MM.DD').tz('UTC').toISOString() -> '2018-09-20T04:00:00.000Z'

НЕОЖИДАННОЕ ПОВЕДЕНИЕ СО ВРЕМЕНИ UNIX

Однако ... когда я рассчитываю время unix на сервере, используя точно такой же ввод даты, я получаю 1537401600000 вместо ожидаемого 1537416000000, то есть точно 4 часа выходных.Я предполагаю, что что-то может быть не так со временем сервера, но у меня сложилось впечатление, что явное преобразование в unix решает эту проблему.

Печать приведенного ниже эквивалента Unix для справки, взятого с одного из серверов.

let unix_present = moment('2018.09.20', 'YYYY.MM.DD').tz('America/Toronto').unix()*1000

-> 1537416000000

let unix_present = moment('2018.09.20', 'YYYY.MM.DD').tz('UTC').unix()*1000

-> 1537416000000

1 Ответ

0 голосов
/ 22 сентября 2018

Несколько вещей:

  • Во всех описанных вами случаях moment('2018.09.20', 'YYYY.MM.DD') анализирует дату как полночь в вашем местном часовом поясе.Таким образом, вы получите разные результаты в зависимости от того, в каком часовом поясе вы используете код.

  • Во всех случаях вы используете .tz('some zone'), что для преобразование мгновение в определенную зону.Поскольку вы впоследствии запрашиваете время Unix (которое указано в UTC, как указано выше), преобразование часового пояса не влияет на вывод.

  • Вам не нужно делать.unix()*1000, вы можете просто сделать .valueOf() - так как миллисекунды уже отслеживаются внутри.

Если вы имели в виду полночь этой даты в Торонто, то:

moment.tz('2018.09.20', 'YYYY.MM.DD', 'America/Toronto').valueOf() //=> 1537416000000

Если вы подразумевали полночь этой даты в UTC, то вам не нужен момент-часовой пояс, просто:

moment.utc('2018.09.20', 'YYYY.MM.DD').valueOf()  //=> 1537401600000
...