момент-часовой пояс setDefault ведет себя не так, как ожидалось

Используя следующий код:

console.log(moment().toJSON());
moment.tz.setDefault("Europe/Brussels");
console.log(moment().toJSON());

Я получаю следующий результат:

2019-05-12T10:39:12.851Z
2019-05-12T10:39:12.863Z

Однако, когда я читаю документацию по моменту-часовому поясу, setDefault должен установить мой часовой пояс по умолчанию на «Европа/Брюссель», поэтому вывод должен быть:

2019-05-12T10:39:12.851Z
2019-05-12T11:39:12.863Z

По-видимому, setDefault нельзя использовать для того, что я хочу (что создает новую дату, как если бы я был в указанном часовом поясе), так что было бы лучшим вариантом для этого?


person ssougnez    schedule 12.05.2019    source источник


Ответы (1)


setDefault работает как положено, проблема в том, как вы отображают значение экземпляров моментов. toJSON() показывает время для UTC (см. также toISOString(): .toISOString() возвращает отметку времени в формате UTC):

При сериализации объекта в JSON, если есть объект Moment, он будет представлен в виде строки ISO8601 с поправкой на UTC.

Если вместо этого вам нужна строка ISO8601, отражающая utcOffset() момента, вы можете изменить функцию toJSON следующим образом:

moment.fn.toJSON = function() { return this.format(); }

Таким образом, вместо этого вы можете использовать format(), вот пример:

console.log(moment().toJSON());
console.log(moment().format());
moment.tz.setDefault("Europe/Brussels");
console.log(moment().toJSON());
console.log(moment().format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/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>

person VincenzoC    schedule 12.05.2019