2015-01-28 1 views
9

Иногда я заканчиваю datetime на переднем конце веб-сайта, который уже настроен на определенный часовой пояс, и я хочу отображать его точно так же, как и вне зависимости от часового пояса пользователя ,Отображение даты и времени с помощью MomentJs без изменения часового пояса

Для примера скажем, у меня есть эта дата:

2015-01-22T16: 11: 36.36-07: 00

-07: 00 означает, что он находится в Mountain Time, и MomentJs это знает и автоматически настраивается для пользователей в других часовых поясах. Например сказать, что я отображения DateTime с этим кодом:

moment('2015-01-22T16:11:36.36-07:00').format('l LT') 

Пользователь в Центральном времени (-06: 00) будет видеть время, как 5:11 PM вместо 4:11 PM. Как я могу сказать MomentJs не настраиваться на часовой пояс пользователя и отображать дату-время как есть?

+0

После прочтения вашего поста после моего ответа ниже, это звучит, как вы, возможно, на самом деле хотите, чтобы отобразить время, как 4:11 PM для всех пользователей независимо от их часовой пояс. Если это так, то подход 'utc()' не будет работать. Кроме того, если это то, что вы хотите сделать, это часовой пояс времени, представленный каким-то другим способом для конечного пользователя? – musicfuel

+0

Возможный дубликат даты [даты JSON, даты отображения даты в часовом поясе сервера] (http://stackoverflow.com/questions/19002255/json-date-display-original-date-in-the-servers-timezone) –

+0

Это похоже но название этого вопроса вводит в заблуждение в этом случае использования. – Sgraffite

ответ

16

Используйте способ моментального удаления utc(), чтобы удалить часовой пояс и отобразить все в универсальное время.

moment.utc('2015-01-22T16:11:36.36-07:00').format('l LT') 

Это будет отображать время, как в UTC, без какого-либо смещения часового пояса. Если вы хотите отобразить время, записанное в пользовательском/серверном часовом поясе, вы можете проанализировать информацию о зоне, когда вы создаете экземпляр момента, и используете ли он часовой пояс, записанный в анализируемой строке.

moment.parseZone('2015-01-22T16:11:36.36-07:00').format('l LT'); 

С любым из этих подходов вы должны подумать о том, чтобы обозначить время каким-то образом, чтобы отразить часовой пояс, на который соответствует время. Несоблюдение этого может привести к большой путанице для конечных пользователей.

+1

Это работает, однако я искал более простое решение, чтобы избежать этого. Как бы то ни было, мне пришлось бы поместить эту логику в шаблоны рулей, которые были бы действительно противными. Возможно, правильным решением является изменение способа возврата данных с сервера, но я также буду рассматривать другие клиентские решения. – Sgraffite

+0

Если вы положили его на клиентскую сторону, я бы рекомендовал сделать это как помощник руля, чтобы логика была сделана только один раз, и вы можете легко включить его в свои шаблоны с помощью простого тега разметки. – musicfuel

+0

Как в стороне, как эти моменты отображаются конечным пользователям? Кажется странным, что требование хотело бы иметь время, представленное в их исходных часовых поясах, не преобразовывая время на клиенте. – musicfuel

1

Я создал расширение для отображения DateTime, не пытаясь приспособиться к часовому поясу пользователя:

(function (moment) { 
    moment.fn.nozone = function() { 
     var m1 = moment(this); 
     var offsetInMinutes = m1.utcOffset(); 
     return m1.utc().add(offsetInMinutes, 'm'); 
    }; 
}(moment)); 

Таким образом, это легко для повторного использования, даже в JavaScript шаблонов.

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