Как получить время в секундах после использования utcoffset

const epoch = Date.UTC(2017,09,24)

const moment_epoch = moment.utc(epoch).utcOffset(5.5).valueOf()

Почему epoch и moment_epoch производят тот же результат, когда я добавляю смещение?

Как получить время эпохи после добавления смещения?

1 ответ

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

  • Date.UTC(2017,09,24) производит отметку о времени, эквивалентную 24 - го октября 2017 года, в полночь, в UTC (1508803200000).
  • moment.utc(epoch) производит дату в UTC, что эквивалентно значению millis выше:

    Вт 24 окт 2017 00:00:00 GMT +00 00

  • moment.utc(epoch).utcOffset(5.5) просто преобразует дату UTC в +05:30 offset:

    Вт Окт 24 2017 05:30:00 GMT +05 30

Но обе даты соответствуют одному и тому же моменту (полуночи в формате UTC совпадают с 5:30 утра в +05:30 offset), поэтому значение миллиса будет одинаковым (оба будут 1508803200000).

Не уверен, что именно вы пытаетесь сделать, но в любом случае:

  • если вы хотите добавить 5 часов и 30 минут до даты, просто выполните:

    moment.utc(epoch).add(5, 'h').add(30, 'm')

    Обратите внимание, что это не изменяет смещение. Он просто получает дату, которая составляет 5 часов и 30 минут после первоначального.

  • если вам нужна дата, которая соответствует полуночи в +05:30, вы можете сделать:

    moment.utc(epoch).utcOffset(5.5, true)

    Второй параметр сообщает momentjs сохранить одну и ту же локальную дату/время, поэтому вместо преобразования в дату/время в смещение он сохраняет одинаковые значения - в этом случае в +05:30 будет полночь +05:30 offset:

    Вт 24 окт 2017 00:00:00 GMT +05 30

Что касается вашей ссылки jsfiddle, я немного изменил ее, чтобы напечатать смещение:

moment.utc(1508803200000).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 00:00 +00:00
moment.utc(1508803200000).utcOffset(5.5).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 05:30 +05:30
moment.utc(1508803200000).utcOffset(5.5, true).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 00:00 +05:30
moment.utc(1508803200000).valueOf() // 1508803200000
moment.utc(1508803200000).utcOffset(5.5).valueOf() // 1508803200000
moment.utc(1508803200000).utcOffset(5.5, true).valueOf() // 1508783400000

Значение 1508803200000 соответствует 2017-10-24T00:00:00Z (полночь в UTC) и 2017-10-24T05:30+05:30 (5:30 в Индии).

Первая строка просто получает это значение в UTC, поэтому результат 24/10/2017 00:00 +00:00.

Вторая строка преобразует это значение в соответствующую локальную дату/время в +05:30 offset. Это не изменяет значение эпохи (оно все равно соответствует 1508803200000). Результатом является эквивалентная дата/время в Индии, которая 24/10/2017 05:30 +05:30 (5:30 утра в офсет +05:30, эквивалент полуночи в UTC - оба представляют одинаковые мгновенно, поэтому значение valueOf() одно и то же).

Третья строка (с utcOffset(5.5, true)) не конвертирует полночь в UTC в 5:30 утра в Индии. Вместо этого он создает дату, эквивалентную полуночи в Индии, поэтому результат 24/10/2017 00:00 +05:30. И valueOf() возвращает 1508783400000, что эквивалентно полуночи в Индии и 23/10/2017 18:30 в UTC (6:30 вечера накануне, поэтому стоимость ниже первоначальной).

licensed under cc by-sa 3.0 with attribution.