Каковы различия между тем, как мы строим часовой пояс момента? - PullRequest
0 голосов
/ 21 декабря 2018

moment("2014-06-01T12:00:00Z").tz("America/Los_Angeles") против moment.tz("2014-06-01T12:00:00Z", "America/Los_Angeles")

Согласно https://momentjs.com/timezone/ в примере показаны оба варианта, но он не объясняет, какой способ предпочтительнее.

1 Ответ

0 голосов
/ 21 декабря 2018

Я согласен, что примеры момент-часовой пояс немного вводят в заблуждение. Обратите внимание, что moment.tz предназначен для анализа ввода с использованием данной зоны:

Конструктор moment.tz принимает все те же аргументы, что и конструктор момента, но использует последний аргумент в качестве идентификатора часового пояса .

, тогда как tz() предназначен для преобразования объекта момента в заданный часовой пояс.


Для "2014-06-01T12:00:00Z" и moment("2014-06-01T12:00:00Z").tz("America/Los_Angeles"), и moment.tz("2014-06-01T12:00:00Z", "America/Los_Angeles") дают одинаковый результат, поскольку вход содержит Z это означает +00:00 смещение.

Обратите внимание, что, как указано Мэттом Джонсоном (член команды momentjs и гуру даты / часового пояса) в этот комментарий :

поскольку вход содержит Z, он действительно будет обрабатываться как UTC и будет преобразован с помощью moment.tz(input, zone).Это немного плохая форма, так как простое падение Z изменит поведение

Поэтому я предлагаю использовать moment.utc для анализа входных сигналов UTC, а затем преобразовать в желаемый часовой пояс, используяtz().См. этот связанный вопрос .


Вот пара примеров использования различных подходов для анализа различных входных данных:

// UTC input
console.log( moment("2014-06-01T12:00:00Z").tz("America/Los_Angeles").format() );
console.log( moment.tz("2014-06-01T12:00:00Z", "America/Los_Angeles").format() );
// No Z in the input (no UTC)
console.log( moment("2014-06-01T12:00:00").tz("America/Los_Angeles").format() );
console.log( moment.tz("2014-06-01T12:00:00", "America/Los_Angeles").format() );

// My suggested way
console.log( moment.utc("2014-06-01T12:00:00Z").tz("America/Los_Angeles").format() );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
...