Значение часового пояса Moment.js для возврата неправильной метки времени

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

moment.tz(moment(), "Pacific/Auckland").valueOf();

Проблема в том, что пока я это делаю, объект moment.tz() выглядит хорошо, но метод valueOf() каким-то образом вычисляет его обратно в часовой пояс, установленный на моем компьютере.

Что не так с моим подходом?

Спасибо большое.

ИЗМЕНИТЬ 1

moment.tz(moment(), "Pacific/Auckland").format(); дает мне правильную строку времени

moment.tz(moment(), "Pacific/Auckland").valueOf("x"); дает мне миллисекунды, но опять же по моему местному времени, а не по "тихоокеанскому/оклендскому" времени.

Итак, каким-то образом вычисление миллисекунд преобразует его обратно в местное время, но почему? И каков правильный подход для получения миллисекунд в ожидаемом часовом поясе?


person user3507003    schedule 25.04.2016    source источник
comment
Как правило, числовые метки времени всегда указываются в формате UTC. Никакая игра с часовыми поясами этого не изменит.   -  person Matt Johnson-Pint    schedule 26.04.2016


Ответы (2)


Я думаю, что может быть просто концептуальное непонимание того, что такое метка времени на самом деле.

Скажем, текущее время, где я нахожусь:

25.04.2016 в 10:21 (UTC-7)

Какова временная метка этого момента?

1461604867

Что такое время UTC?

25.04.2016 в 17:21 (UTC)

Какова временная метка этого момента?

1461604867

Что же, почему?

Момент времени имеет одну и ту же отметку времени, независимо от того, в каком часовом поясе он находится. Когда вы вызываете moment(), это относится к прямо СЕЙЧАС, к этому конкретному моменту времени в большом пространственно-временном континууме. . То же самое с Date.now(). Момент, когда вы это читаете, на самом деле все тот же самый момент, где вы находитесь, где я, в Японии, в Антарктиде, в Сирии, в Гренландии и т. д. Так уж получилось, что этот момент представлен визуально ( строка времени) людьми по-разному в каждой области.

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

person aaronofleonard    schedule 25.04.2016
comment
Это очень хороший ответ. Я хотел бы немного изменить его. момент часового пояса влияет на объект даты, который он хранит, если вы конвертируете строку в определенный часовой пояс. Если мой компьютер находится в Лондоне и я хочу получить отметку времени для транзакции в Нью-Йорке в 17:00, я должен указать часовой пояс или рассчитать смещение самостоятельно, иначе я получу неверную отметку времени. - person VeteranCoder; 19.10.2017

var time  = moment.tz("2016-04-25 12:00", "Pacific/Auckland");

тогда

time.format();

Попробуй это

person Sagar R    schedule 25.04.2016
comment
Спасибо за ваш ответ. time.format() дает мне правильную строку, но мне нужно получить отметку времени в миллисекундах. Почему .valueOf() дает другое значение, чем .format()? - person user3507003; 25.04.2016
comment
чем попробовать, момент (). миллисекунда () - person Sagar R; 25.04.2016
comment
Не решение проблемы. - person user3507003; 25.04.2016