2014-02-19 4 views
2

Я понимаю, что datepicker (я использую AngularStrap's datepicker) является «позади» дня из-за того, как даты вычисляются в javascript. Моя проблема в том, как мне заставить ее не учитывать часовой пояс и просто придерживаться введенной даты ... никаких настроек?Angularjs, Datepicker один день beind

Я выбираю 1 февраля 2014 года в даче. Моя ценность на экране 2/1/2014, и я хочу, чтобы это значение было сохранено. Тем не менее, datepicker превращает это в Fri Jan 31 2014 19:00:00 GMT-0500 (EST), по-видимому, потому, что он вычитает 5 часов для моего часового пояса с введенной даты. Я не хочу это. Если я вхожу 2/1/2014, я хочу эту дату, независимо от часового пояса.

Каков наилучший способ перехватить/изменить/изменить это значение, так что ввод 2/1/2014 дает мне именно эту дату ... нет преобразования для часового пояса? Должен ли я сам изменить сам датапикер (это похоже на плохую идею)? Должен ли я сам изменить значение до отправки его на бэкэнд путем добавления какого-либо смещения? Если да, как вы добавляете время к значению, отображаемому консолью как Fri Jan 31 2014 19:00:00 GMT-0500 (EST)?

ответ

0

Если вы не против загрузки другого ресурса, я бы рекомендовал использовать MomentJS, поскольку он принимает боль из дат в JavaScript. Вы можете сделать что-то вроде `moment (datepicker value) .local() ', чтобы получить дату без смещения часового пояса.

http://momentjs.com/docs/#/manipulating/local/

+0

Это не сработает, потому что я уже предоставляю значение дня месяца и года для параметра datepicker. Я не предоставляю часовой пояс, он автоматически делает это, и это проблема. Датпикер видит, например, 2/1/14, и он преобразует это до 1 февраля 2014 00:00:00, а затем вычитает из него мой часовой пояс, давая мне 28 января 2014 года в 19:00:00. Передача этого значения с момента не обойдет эту проблему. – Lothar

+0

модель для выбора даты возвращает значение, отличное от введенного вами, поэтому почему бы просто не отрегулировать это, используя momentJS перед отправкой на сервер? –

1

Я решил эту проблему с помощью пользовательской директивы https://gist.github.com/weberste/354a3f0a9ea58e0ea0de

Это для Угловое Bootstrap DatePicker, но я думаю, он должен работать для AngularStrap DatePicker, а так как она зависит только от соответствующего ngModel, а не DatePicker сам.

По существу, я переформатирую значение всякий раз, когда дата выбрана на датупиксере (это значение, строка в формате yyyy-mm-dd, будет сохранена на модели) и всякий раз, когда к модели обращаются, чтобы заполнить представление , Мне нужно снова обернуть его в объект Date, поэтому datepicker обрабатывает его правильно.

Другими словами, это точно делает перехваты, которые вы задаете в своем вопросе.

+0

Вы могли бы показать, что суть в контексте? У меня такая же проблема, но ваша директива не работает для меня. –

0

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

этот вопрос в моем случае было то, что datepicker использовал неправильный часовой пояс, поэтому, когда я попытаюсь отредактировать событие, будет отображаться неверная дата, даже если правильная дата была сохранена в db. Следующие фиксированные это для меня:

var evDate = new Date(data.eventDate); //data.eventDate is the date string 
evDate.setMinutes(evDate.getMinutes() + evDate.getTimezoneOffset()); 

$scope.eventInfo.eventDate = evDate; 

Я нашел решение здесь: https://github.com/angular-ui/bootstrap/issues/2628

0

Я нашел способ. сначала конвертируйте эту дату в строку. вот код.

var SelectDate = $scope.GetFormattedDate(Date.parse($("#Date").datepicker("getDate")));    
    $scope.GetFormattedDate = function (CalDate) { 
      var re = /-?\d+/; 
      var WDate = CalDate.toString(); 
      var m = re.exec(WDate); 
      var lastDate = new Date(parseInt(m[0])); 
      var mm = lastDate.getMonth() + 1; 
      var dd = lastDate.getDate(); 
      var yyyy = lastDate.getFullYear(); 
      var formattedDate = mm + '/' + dd + '/' + yyyy; 

      return formattedDate; 
     } 

Now Pass SelectDate для вашего контроллера. проблема с бинго была решена :)

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