moment.js, часовые пояса и переход на летнее время

Я возвращаю список дат / времени UTC из службы .Net в таком формате:

"2013-07-09 19:48:07 +00:00".

На клиенте я конвертирую каждое из этих строковых значений в соответствующий момент в формате UTC, например

var fooUtc = new moment.utc(serverDateTimeString)

На странице есть выпадающий список, содержащий список часовых поясов, которые пользователь может изменить. Они привязаны к набору объектов часовых поясов, например следующих:

{
    id: "Central Standard Time",
    label: "(UTC-06:00) Central Time (US & Canada)",
    observesDaylightSavings: true,
    baseUtcOffset: {
        asHours: -6,
        asMinutes: -360,
        asText: "-06:00"
}

Затем я отображаю каждый момент, проходящий в выбранном смещении часового пояса, например:

fooUtc.local().zone(selectedTimeZone.baseUtcOffset.asMinutes).format()

Однако результат не учитывает летнее время, поскольку данные о часовом поясе, поступающие из .Net, не различают смещения dst и non dst.

Есть ли способ заставить эту работу работать с moment.js или новыми битами моментального часового пояса? Я думаю, что это было бы возможно, если бы я мог сопоставить стандартные имена смещений UTC (например, «Центральное стандартное время») с данного часового пояса Olson Идентификатор БД (например, "Америка / Чикаго"), но если есть более простой способ, дайте мне знать.


person Joshua Barker    schedule 09.07.2013    source источник
comment
В итоге я создал файл сопоставления на основе [этот пост] [1] [1]: stackoverflow.com/questions/8372537/   -  person Joshua Barker    schedule 10.07.2013


Ответы (1)


Вам следует изучить использование Noda Time на стороне .Net и момент-часовой пояс на клиенте, передав идентификатор часового пояса IANA / Olson.

Если вы хотите придерживаться идентификаторов часовых поясов Windows в раскрывающемся списке, вы можете выполнять преобразования с данными CLDR, встроенными в Noda Time. Я описал, как это сделать, в этом сообщении: Как переводить между часовыми поясами Windows и IANA?

Но лучшим решением было бы полностью избегать зон Windows. Вы можете заполнить список идентификаторов IANA / Olson, используя технику, которую я описываю в этом сообщении: Как мне заполнить список времени IANA / Olson зоны от Noda Time?

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

Если вы можете работать строго в зонах IANA / Olson, тогда нет необходимости в преобразовании. Вы можете отказаться от объекта Windows TimeZoneInfo и использовать вместо него Noda Time. При желании можно заменить только функции преобразования часового пояса, а остальные оставить нетронутыми. Или вы можете сделать все возможное и заменить все свои DateTime и DateTimeOffset использования типами Noda Time. Тебе решать.

person Matt Johnson-Pint    schedule 10.07.2013
comment
это было бы неплохо, но пользовательские настройки хранятся в БД с использованием идентификатора часового пояса, поэтому я пока придерживаюсь его. Спасибо за предупреждение о Noda ... Я посмотрю ... - person Joshua Barker; 12.07.2013