1

Мы используем DateTimePicker Кендо, реализуется с помощью директивы AngularJS:Кендо DateTimePicker Не Handling UTC Offset

<input type="text" kendo-date-time-picker k-ng-model="TheDateModel"> 

Где: TheDateModel = 2016-02-15 20: 58: 24,0000000 +00: 00

Я нахожусь в часовом поясе КНТ, что на -6 часов смещено от GMT. Текущий результат datetimepicker показывает время 8:58 вечера, но мой ожидаемый результат - 14:58.

В чем я ошибаюсь?

ответ

0

Я был по этой дороге и должен был осуществить это:

http://www.telerik.com/support/code-library/using-utc-time-on-both-client-and-server-sides

+1

К сожалению, ответ на эту ссылку нарушает «Часовой пояс! = Смещение». Если смещение для выбранной даты отличается от * текущего * смещения (например, из-за летнего времени), тогда результирующее время будет на час. –

1

Отказ от ответственности: Я работаю для команды Кендо UI

Кендо UI Datepicker использует JavaScript Date объект внутренне удерживайте выбранное значение даты. Как вы, вероятно, знаете, он всегда использует локальный часовой пояс. Мы пытались объяснить, что предостережение в нашей документации тоже:

Из-за это поведение по умолчанию, виджет будет использовать уже преобразованное значение Date (с примененным местным часовым поясом). Виджет не манипулирует часовым поясом значения, так как он не имеет достаточной информации, как это сделать.

Решение

Лучший подход в данном случае заключается в преобразовании строк Date (как один вы упомянули «2016-02-15 20: 58: 24,0000000 +00: 00») вручную, прежде чем кормить Виджет DatePicker. Например, вот один из возможных подходов, чтобы сделать это:

Обратите внимание, как анализируется значение, а затем корректируется в методе loadData. Подобное должно быть сделано разработчиком, которому необходимо обрабатывать различные TZ в своем приложении.

+1

Когда браузер находится в часовом поясе, у которого есть летнее время, это не будет работать в течение короткого периода каждый год. Когда происходит переход на летнее время весны, существует час, который не существует по местному времени, потому что часы перемещаются вперед 1 час. Например, если часовой пояс браузера - Австралия/Сидней, попробуйте подключить время между 2017-10-01 02:00 и 03:00 http://dojo.telerik.com/afetEB или если часовой пояс браузера - Европа/София, попробуйте время между 2017-02-26 03:00 и 04:00 http://dojo.telerik.com/epAmob В UTC эти времена действительно существуют, но нет возможности отобразить их с помощью объекта JavaScript Date. – Smiffy

+1

Да, вы абсолютно правильно. Экземпляр Date учитывает только изменения DST локального часового пояса. При этом вы не можете имитировать различные TZ, когда происходит летнее летнее время. Это же ограничение применимо к виджету DatePicker, который наследует те же ограничения. Все возможные решения, используя пользовательские структуры дат, работающие только с миллисекундами UTC, не будут работать с виджетами, которые используют объекты Date внутри. Наиболее надежным решением будет разработка пользовательского виджета, который работает только с специализированной структурой данных, которая игнорирует локальные изменения DST. –

0

Итак, я нашел решение своей проблемы. Во-первых, для ясности и извинения за дезинформацию, но моя дата сходит с сервера как 2016-02-15T20: 58: 24.0000000 + 00: 00 - добавьте T и удалите все пробелы.

Все, что нужно сделать, чтобы добавить атрибут к-разбор форматы с директивой следующим образом:

<input type="text" kendo-date-time-picker k-parse-formats=['yyyy-MM-ddTHH:mm:sszzz'] k-ng-model="TheDateModel"> 

Boom, считает смещение и текущий часовой пояс, и правильно анализирует и отображает дату и время. Просто имейте в виду, что когда вы укажете свои собственные форматы разбора, включите все возможные форматы, которые могли бы быть вашими датами.

Например, я столкнулся с проблемой, когда в мои даты было миллисекунды, превышающие 0: 2016-02-15T20: 58: 24.1234567 + 00: 00. Это снова сломало datetimepicker. Упрощенное исправление: просто изменил формат разбора на: yyyy-MM-ddTHH: mm: ss.fffffffzzz.Убедитесь, что число f больше или равно числу возможных миллисекунд.

<input type="text" kendo-date-time-picker k-parse-formats=['yyyy-MM-ddTHH:mm:ss.fffffffzzz'] k-ng-model="TheDateModel">