错误:[ngModel:datefmt]预计`2015-05-29T19:06:16.693209Z`为日期 - Angular

时间:2015-05-29 19:45:36

标签: javascript angularjs django django-rest-framework

我正在func componentsSeparatedByString(_ separator: String) -> [AnyObject]申请angularDjango ..

应用程序从服务器接收json的信息..其中一个键是rest-framework ...此字段的值是created_time的格式,例如iso-8601

在客户端我有一个字段:

2015-05-29T19:06:16.693209Z

但是当数据到达时我得到了这个错误:

<input type="time" ng-model="created_time">

我已经尝试过所有内容:(格式与角度文档中的说明完全相同...

9 个答案:

答案 0 :(得分:80)

这必须发生角度1.3+。对于日期/时间输入,ng-model的1.3+需要是有效的日期对象,不再允许日期的字符串表示。您需要将字符串转换为日期对象($scope.created_time = new Date(dateString))并将其绑定到ng-model。如果您按照the docs进行操作,则会明确说明错误以及如何解决错误。

  

所有与日期相关的输入都需要将模型作为Date对象。如果模型是其他内容,则会抛出此错误。在这种情况下,Angular不会设置验证错误,因为这些错误会显示给用户,但错误的状态是由错误的应用程序逻辑引起的,而不是由用户引起的。

答案 1 :(得分:34)

如果从REST服务获取数据,只需将字段转换为日期即可。

$http.get(url).success(function(data){
     $scope.data = data; // get row data
     $scope.data.mydatefield = new Date($scope.data.mydatefield); // convert filed to date
});

答案 2 :(得分:16)

创建一个转换模型值的简单指令:

HTML:

<input date-input type="time" ng-model="created_time">

指令:

app.directive('dateInput', function(){
    return {
        restrict : 'A',
        scope : {
            ngModel : '='
        },
        link: function (scope) {
            if (scope.ngModel) scope.ngModel = new Date(scope.ngModel);
        }
    }
});

答案 3 :(得分:9)

除了PSL的回答。 这是如何将角度1.3+要求覆盖为Date对象。

<input type="date" ng-model="book.date" date-format/>

app.directive('dateFormat', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attr, ngModelCtrl) {
      //Angular 1.3 insert a formater that force to set model to date object, otherwise throw exception.
      //Reset default angular formatters/parsers
      ngModelCtrl.$formatters.length = 0;
      ngModelCtrl.$parsers.length = 0;
    }
  };
});

它可以与AngularFire $ firebaseObject一起使用,并且可以与$ bindTo三向绑定一起使用。无需扩展$ firebaseObject服务。它适用于Ionic / cordova应用。

Working example on jsfiddle

基于this answer

答案 4 :(得分:0)

问题实际上这是日期格式问题,我已经通过使用这段代码解决了这个问题。 解决方案:下面的代码将解决此问题:

            var options = {
                weekday: "long", year: "numeric", month: "short",
                day: "numeric", hour: "2-digit", minute: "2-digit"
            };
            $scope.created_time = $scope.created_time.toLocaleTimeString("en-us", options);

其中en-us format =“2013年2月1日星期五06:00 AM”,希望这有助于其他人解决问题,我遇到了这样的错误并解决了有这个。

答案 5 :(得分:0)

我有这个错误,我直接使用了对象:我发布了我执行的解决方案:
1:$ userData.dob = new Date(userData.dob); 2:$ scope.edit.userdob = userData.dob;    在我遇到上述错误之前,我直接创建了对象并将其分配给编辑范围,问题得到了解决。

答案 6 :(得分:0)

如果日期减少1天,请使用此代码,

new Date(moment.utc(value).format('l LT'))

答案 7 :(得分:0)

以类似于 cs1707 answer 的方式,我必须创建一个指令,但要逐部分进行字符串到时间的转换。我添加了它作为那些想要快速复制代码的人的答案。

添加这个指令

app.directive("formatTime", function(){
   return {
    require: 'ngModel',
    link: function(scope, elem, attr, modelCtrl) {
      modelCtrl.$formatters.push(function(modelValue){
        var string=modelValue;
        var date=new Date();
        var time=string.split(':');
        date.setHours(+time[0]);
        date.setMinutes(time[1]);
        date.setSeconds(time[2]);
        return date;
      })
    }
   }
 })

format-time 到您的 HTML input 标签:

<input type="time" data-ng-model="mytime" format-time>

答案 8 :(得分:-2)

如果您需要更新Array with Objects

中的所有日期
var data = [
  { id: "1" , birthday: "2016-01-20T11:24:20.882Z"},
  { id: "2" , birthday: "2016-01-20T11:24:20.882Z"},
  { id: "3" , birthday: "2016-01-20T11:24:20.882Z"},
];

  function convertDataStingToObject (data) {
    for(var i=0; i < data.length; i++ ){
      console.log('string: ' + data[i].birthday);
      data[i].birthday = new Date(data[i].birthday);
      console.log('updated: ' + data[i].birthday);
      console.log(typeof(data[i].birthday));
    }

    return data;
  }

convertDataStingToObject(data);