Конвертировать местное время в UTC - PullRequest
0 голосов
/ 04 января 2019

Я ищу способ конвертировать объект даты Javascript по местному времени, используя часовой пояс, такой как America/New_York:

2019-01-04T00:00:00.000Z

Я хотел бы преобразовать это в объект даты в UTC.

2019-01-04T05:00:00.000Z

const timezone = 'America/New_York';
const localMidnight = new Date(Date.UTC(2019, 0, 4)) // 2019-01-04T00:00:00.000Z
moment.tz(localMidnight, timezone).utc().toDate()

Здесь это все еще возвращает то же самое как вход 2019-01-04T00:00:00.000Z.

> m(localMidnight, 'America/New_York').tz('utc').toDate()
2019-01-04T00:00:00.000Z
> m(localMidnight, 'America/New_York').tz('UTC').toDate()
2019-01-04T00:00:00.000Z
> m(localMidnight, 'America/New_York').utc().toDate()
2019-01-04T00:00:00.000Z

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Для достижения ожидаемого результата используйте опцию ниже

Синтаксис - момент (дата) .tz (часовой пояс) .utc (). Format ()

Для формата -ГГГГ-ММ-ДДЧЧ: мм: сс.SSSZ используйте toISOString () вместо format ()

const timezone = 'America/New_York';
const localMidnight = new Date(Date.UTC(2019, 0, 4))
console.log("newTime in utc",  moment(localMidnight).tz(timezone).utc().format())
console.log("newTime",  moment(localMidnight).tz(timezone).utc().toISOString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.js"></script>

codepen - https://codepen.io/nagasai/pen/gZegqd?editors=1010

0 голосов
/ 05 января 2019

Я думаю, вам нужно создать дату на основе даты и времени в определенном часовом поясе, а затем создать метку времени ISO 8601 для UTC.

Комментариев ниже должно быть достаточно, но спросите, нужна ли вам дополнительная помощь.

// Create a moment for midnight in America/New_York
var newYork = moment.tz("2019-01-04 00:00", "America/New_York");

// Create an ISO 8601 timestamp UTC
console.log(newYork.utc().format()); // 2019-01-04T05:00:00Z
<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript" src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>

Обратите внимание, что вызов utc запускает режим UTC, который имеет побочные эффекты в дополнение к форматированию как ISO 8601 и UTC.

0 голосов
/ 05 января 2019

Кажется, что проблема была в формате даты, которую вы создали, в этом примере вы можете видеть, что .toISOString() добавляет Z в конце, и чтобы метод moment.tz работал вам нужно удалить это письмо из формата.

Вот пример создания новой даты в 'America/New_York' и изменения часового пояса на UTC

const timezone = 'America/New_York';
const localMidnight = new Date(2019, 01, 04);

console.log("Original time:")
console.log(localMidnight.toISOString());

console.log("Converted to UTC:");
console.log(moment.tz(localMidnight.toISOString().slice(0, -1), timezone).utc().format());   
<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript" src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
...