MomentJS и часовые пояса / UTC - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть объект даты JavaScript, пришедший из API;но когда я использую Момент, чтобы сделать некоторые манипуляции с датой, компонент часового пояса испортился, и итоговая дата теперь использует местное время по Гринвичу:

var d = new Date("2018-09-30T00:00:00+10:00");
var m1 = moment(d).toDate(); // 2018-09-29T14:00:000Z
var m2 = moment.utc(d).toDate(); // 2018-09-29T14:00:000Z

Как мне сохранить информацию о часовом поясе, чтобы при начале добавления дней/ часов и т. д., результирующее значение остается в часовом поясе +10: 00?

Если я посмотрю на объект moment, созданный, например, в отладчике Firefox, я вижу, что m1 имеет _tzm:600 и _isUTC:false, тогда как m2 имеет _tzm:600 и _isUTC:true, но в обоих случаях обернутый _d равен 2018-09-29T14:00:000Z, а не 2018-09-30T00:00:00+10:00, как я надеюсь.

Если я позвоню:

var m3 = moment(d).format(); // 2018-09-03T00:00:00+10:00

тогда все в порядке, но теперь у меня есть string, а не Date объект

1 Ответ

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

По определению , объекты Date находятся только в UTC:

Создает экземпляр даты JavaScript, который представляет один момент времени.Объекты даты основаны на значении времени, которое является числом миллисекунд с 1 января 1970 года по Гринвичу.

Браузер обычно преобразует это в местное время, хотя.

Я не уверенчто вы пытаетесь достичь.Тем не менее, в целом, для печати даты в другом часовом поясе, строка будет в порядке.Что касается манипуляции с часовым поясом, Момент Часовой пояс может быть вашим выбором.

При этом, если ваш вариант использования прост, вы можете попробовать напрямую проанализировать момент строки даты и использовать parseZone.Это позволит вам получить точную дату и получить информацию о часовом поясе.

Просто небольшой фрагмент, показывающий это.

const date = '2018-09-30T00:00:00+10:00';

const parseZone = moment.parseZone(date);
console.log('Original time: ', parseZone.format());

const offsetTimezone = parseZone.format('Z');
console.log('Timezone', offsetTimezone);

const utcOffset = parseZone.utcOffset();
console.log('Offset from UTC in minutes', utcOffset);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
...