2016-06-05 3 views
0

Я использую момент JS для обработки своих дат.Вопрос MomentJS с часовым поясом

Установка:

Один вход DateTime элемент One Time Input Элемент

Позволяет говорит, что эти значения:

DateTime = "05/30/2016" and StartTime = "10:00"; 

Я делаю это для преобразования местного времени в UTC:

utcTime = moment(DateStart+ " " + StartTime).toDate().toISOString(), 

но при печати utcTime значение, которое я получаю, «2016-05-30T10: 00: 00 + 01: 00» То, что +01: 00, испортит мое время при передаче его обратно на сервер (размещен на той же машине, что и клиент, разработка машина), когда я получаю данные обратно на сервере, который он отчитывается как 9H вместо 10H, из-за смещения +1. Мой часовой пояс установлен на 0 (часовой пояс LISBON), поэтому смещение должно быть 0.

Есть ли что-то, что мне не хватает?

+0

Почему бы вам просто не удалить +01: 00 из строки, выполняющей простое регулярное выражение, прежде чем отправить его обратно на сервер? –

ответ

1

Когда вы используете момент, обычно нет необходимости когда-либо звонить по номеру .toDate(), если вы не имеете дело с сторонним API. В вашей ситуации, однако, я считаю, что все, что вам нужно, - это преобразовать свою дату из локальной в UTC. Вы почти там, но у вас есть пара вещей, которые нужно очистить. Ваш результирующий код должен быть:

var date ="05/30/2016"; 
var time ="10:00"; 
moment(date+ " " + time, 'MM/DD/YYYY HH:mm').utc().format() 
"2016-05-30T15:00:00Z" 

Несколько вещей, чтобы отметить в этом коде:

Мой текущий часовой пояс UTC-5 прямо сейчас. Как вы можете видеть, время изменилось с 10:00 до 15:00 UTC - это правильное преобразование.

Я указал формат входной строки. Это очень важно. Прямо сейчас вы получаете предупреждение, что говорит:

момент конструкция возвращается к JS Дата

Это важное предупреждение. Без формата ваш код будет вести себя по-разному в разных браузерах и при работе в разных странах. Дополнительная информация здесь: http://momentjs.com/guides/#/warnings/js-date/

Наконец, вы можете увидеть, что я разбираю конструктор moment(), а затем вызываю .utc(). Когда вы разбираете конструктор moment(), вы говорите «интерпретируете эти данные как местный часовой пояс пользователя». Когда вы звоните .utc(), вы говорите: «Теперь показываем тот же момент времени, что и UTC».

Необходимо также отметить, что Лиссабон - это UTC +1 прямо сейчас из-за летнего времени. Значение, которое вы видите сейчас, является правильным. Это 9:00 UTC.

+0

И прямо сейчас я чувствую себя и беззаботно из-за дневных сбережений, которые забыл, поэтому давайте посмотрим, правильно ли я это понял. Пользователь вводит значения в входах: Я использую момент "момент (дата +" "+ время, 'ММ/ДД/ГГГГ ЧЧ: мм'). Utc(). Format()", чтобы вернуть дату в UTC и отправить это сервер. Как только я получаю дату с сервера, я делаю moment(). Utc (datevalue) .format() правильно? Так как utc означает, что я разделяю значение utc правильно? В то же время вы оказали серьезную помощь! Спасибо! – Morphex

+0

Это зависит от вашего формата даты. Это в ISO8601 расширен со смещением? (2016-01-01T00: 00: 00,00 + 01: 00)? Если это так, то вы можете просто использовать конструктор момента, и он автоматически преобразует из предоставленного смещения в локальное время пользователя. Если у вас нет смещения, вы должны использовать moment.utc (date, format) .local(), чтобы вернуться к локальному. –

+0

Я написал это очень длинное сообщение в блоге о том, как моментальные смещения обрабатываются, и все его функции-конструкторы: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/ –

Смежные вопросы