Преобразование даты в местное время - PullRequest
0 голосов
/ 04 октября 2018

У меня есть переменная даты UTC:

let d = '/Date(1538560800000+0200)/';

Я попытался преобразовать это в местное время, но безуспешно:

moment(accessGroup.TimeOn).toDate() // result: Wed Oct 03 2018 12:00:00 GMT+0200 (Central European Summer Time)
moment(d).local().format("DD-MM-YYYY hh-mm-ss"); // result: "03-10-2018 12-00-00"
moment.utc(d).local().format("DD-MM-YYYY hh-mm-ss"); // result: "03-10-2018 12-00-00"

Я хочу получить свое местное время 14:00: 00.Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

При создании момента из строки мы сначала проверяем, соответствует ли строка известным ISO 8601 форматам, затем мы проверяем, соответствует ли строка RFC 2822 Дата и времяформат, прежде чем перейти к отступлению от новой даты (строки), если известный формат не найден.

Момент принимает форматы ISO 8601 и RFC 2822 для строковых параметров, и вы вводите /Date(1538560800000+0200)/ни.Тем не менее, когда вы передаете это в moment, он пытается преобразовать это в строку и заканчивает тем, что извлекает возможный параметр метки времени, который равен 1538560800000.Это можно увидеть в следующем коде, так как оба значения заканчиваются одинаковыми значениями.

let d = '/Date(1538560800000+0200)/'
moment(d).toString() // Wed Oct 03 2018 12:00:00 GMT+0200
moment(1538560800000).toString() // Wed Oct 03 2018 12:00:00 GMT+0200

1538560800000 при преобразовании в GMT - ср. 03 октября 2018 г. 10:00:00 по Гринвичу + 0000, отсюдавывод следующего кода ..

moment.utc(d).toString() // Wed Oct 03 2018 10:00:00 GMT+0000

Итак, ни при каких обстоятельствах вы никогда не получите время как 14:00:00, поскольку эта временная метка не представляет этого.И отметки времени всегда абсолютны (в GMT), нет такой вещи, как местная отметка времени .


Я чувствую, что разрыв здесь - ваша неправильная интерпретация вводимой строки, вы думаете ..

  • Преобразование 1538560800000 в местное время, которое является 3 октября, 12:00:00 (местное)
  • Добавить +0200 часы до него, что означает перевести его на 3 октября, 14: 00: 00

Но, правильный способ читать это ..

  • Преобразовать 1538560800000 в дату и время, то есть 3 октября, 10:00:00 (абсолютное время / время по Гринвичу)
  • +0200 представляет часовой пояс источника, который равен GMT+0200.

Опять же, первая интерпретация неверна по причине, указанной выше - метки времени unix всегда в GMT , они никогда не в местных часовых поясах.

0 голосов
/ 04 октября 2018

Я также создал jsfiddle: http://jsfiddle.net/csinghal/dp7rzmw5/34811/

и такой же код, как показано ниже для всех форматов:

 var localDate = new Date(1538560800000+0200);
 var utcFormat = moment(localDate).utc().format('YYYY-MM-DD HH:MM:SS');
 var localFormat = moment.utc(utcFormat, 'YYYY-MM-DD 
 HH:MM:SS').local().format('MM/DD/YYYY hh:mm a');
 console.log('LocalDate: ', localDate);
 console.log('utcFormat: ', utcFormat);
 console.log('localFormat: ', localFormat);
...