угловой момент, дата, время, выбор, директива, часовой пояс, проблема

Следующий код показывает средство выбора даты и времени в форме, и я использую плагин angular-moment-picker в качестве средства выбора. Когда я выбираю определенную дату/время, в поле ввода средства выбора отображается правильное время, но после отправки формы время, введенное в БД, отстает. Поэтому я использовал директиву часового пояса из ответа stackoverflow. Но он выдает viewValue.getMinutes не является ошибкой функции

<div moment-picker="startTime" class="form-control"  name="startTime" 
  ng-model="shiftTimings.startTime" format="YYYY-MM-DD HH:mm:ss" datepicker-localdate > 
     {{ startTime }} </div>

Директива

app.directive('datepickerLocaldate', ['$parse', function ($parse) {
        var directive = {
            restrict: 'A',
            require: ['ngModel'],
            link: link
        };
        return directive;

        function link(scope, element, attr, ctrls) {
            var ngModelController = ctrls[0];

            ngModelController.$parsers.push(function (viewValue) {

                viewValue.setMinutes(viewValue.getMinutes() - viewValue.getTimezoneOffset());

                return viewValue.toISOString().substring(0, 10);
            });


            ngModelController.$formatters.push(function (modelValue) {
                if (!modelValue) {
                    return undefined;
                }

                var dt = new Date(modelValue);

                dt.setMinutes(dt.getMinutes() + dt.getTimezoneOffset());
                return dt;
            });
        }
}]);

person user7620991    schedule 17.10.2017    source источник
comment
Я предполагаю, что проблема связана с данными, которые необходимо сохранить в базе данных, а не с DOM. Директивы являются декоративными элементами DOM. Я предполагаю, что вместо использования директивы напишите простую функцию для обработки данных и передайте ее службе, которая сохраняет данные....   -  person Rakesh Burbure    schedule 17.10.2017


Ответы (1)


Это случилось и со мной! Когда даты javascript передаются в браузер, браузер использует время по Гринвичу, поэтому ваше время отстает в db.

Я использовал обходной путь с moment. Вместо того, чтобы передавать объект даты javascript, я форматирую свою дату моментом, прежде чем передать ее в backed .

Таким образом, shiftTimings.startTime можно манипулировать с таким моментом перед отправкой:

var tempDate=moment(shiftTimings.startTime).format("YYYY-MM-DDTHH:mm:ss.SSS") + 'Z';

затем вы можете передать tempDate своему бэкэнду.

person vertika    schedule 17.10.2017
comment
Я думаю, это сработает. Сейчас проверю и скоро сообщу. Просто любопытно, поэтому и спрашиваю. В случае, если я использую директиву, почему она выдает viewValue.getMinutes, это не функция? - person user7620991; 17.10.2017
comment
ваш viewValue является правильным объектом даты? потому что getMintes() работает с объектом даты javascript. - person vertika; 17.10.2017