2015-05-14 5 views
7

Я использую сборщик данных HTML5. После выбора даты ng-модель показывает более раннюю дату, а не текущую выбранную дату.Дата выпуска в угловом

<input type="date" ng-model="dateModel" /> 

Когда я выбираю текущую дату нг-модель 2015-05-13T18: 30: 00.000Z вместо 2015-05-14. Если я использую в jQuery, он хранится правильно как 2015-05-14

Как я могу это решить?

Plunker - AngularJS

Plunker - JQuery

ответ

5

Это правильная дата для угловых версий, однако дата форматируется UTC, который мог бы оказаться неправильными, если вы не в полной мере осведомлены об этом.

Часовой пояс всегда равен нулю UTC offset, как обозначается суффиксом «Z».

UTC Source

Посмотрите в угловых date filters. Есть много вариантов из коробки, и практически любой желаемый формат может быть получен - но самое главное, разрешен для вашего часового пояса. Например ...

{{dateModel | date:'shortDate'}} // -- prints 5/14/15 
{{dateModel | date:'yyyy-MM-dd'}} // -- prints 2015-05-14 

Plunker Link


Подробнее о явно обеспечивая timezone и доверяя В параметре браузер, чтобы решить наше время (угловые документы)

{{ date_expression | date : format : timezone }} // -- template binding 
$filter('date')(date, format, timezone)   // -- javascript 

часовой пояс на используется для форматирования. Он понимает UTC/GMT и континентальные аббревиатуры часового пояса США, но для общего использования используйте смещение часового пояса , например, «+0430» (4 часа, 30 минут к востоку от ). Если это не указано, будет использоваться часовой пояс браузера .


Если ваши предпочтения явно определить часовой пояс с ngModelOptions, а не используя фильтры, вы можете сделать это следующим

<input type="date" 
    ng-model="dateModel" 
    ng-model-options="{timezone: timezone}" /> 


var date = new Date() 
$scope.timezone = ((date.getTimezoneOffset()/60) * -100) // e.g. -400 EDT 

См this answer, который объясняет логику за ручной расчет

Plunker Link - с ng-model-options

+0

у меня нет хотите использовать фильтр, а использовать ng-model-options – user1184100

+0

@ user1184100 Любая причина? Просто любопытно. В любом случае, обновленный ответ для вас, который включает в себя этот фильтр – scniro

+1

, используется только для отображения, но данные в ng-модели сохраняются в db, поэтому я предпочел бы варианты ng-model – user1184100

1

AngularJS устанавливает модель в формате UTC даты и времени.Я думаю, что это вопрос, вы должны проверить: http://github.com/angular/angular.js/issues/8447

Так что для моего часового пояса, если я изложу ng-model-options="{timezone: '-0200'}" на входе я получаю ту же дату и время, как версия JQuery: http://plnkr.co/edit/Qesmucv4aU5Yqu9sxbtp?p=preview

+0

Я сделал $ scope.timezone = d.getTimezoneOffset(); и изменил html на - это все, что мне нужно сделать? – user1184100

+1

Вам нужно будет делить 'd.getTimezoneOffset()' на 60, потому что он возвращает смещение в минутах, и вам это нужно в часах. Это работает для меня: http://plnkr.co/edit/Qesmucv4aU5Yqu9sxbtp?p=preview –

0
{{dateModel | date : 'yyyy-MM-dd'}} 
// {{ date_expression | date : format : timezone}}