You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS中ng-model为input time赋值失败及[ngModel:datefmt]错误排查

解决AngularJS中绑定值的[ngModel:datefmt]错误

嘿,我刚好踩过这个坑!你遇到的[ngModel:datefmt]错误,本质就是AngularJS对type="time"的输入框有严格的格式要求——它只认符合ISO 8601标准的时间字符串,或者合法的Date对象,其他格式都会触发这个错误,导致输入框不显示值。

先看你可能写错的代码示例

大概率你是传了非标准格式的时间字符串,比如带AM/PM的12小时制,或者用了错误的分隔符:

<div ng-app="myApp" ng-controller="myCtrl">
  <input type="time" ng-model="selectedTime">
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  // ❌ 错误格式:带AM/PM的12小时制
  $scope.selectedTime = "10:30 AM";
  // ❌ 错误格式:用了横杠分隔
  // $scope.selectedTime = "10-30";
});
</script>

这种写法就会直接触发[ngModel:datefmt]错误,输入框自然不会显示你要的时间。

正确的解决方案

分三种场景给你对应写法:

1. 直接使用标准格式的时间字符串

AngularJS接受的标准时间格式是24小时制的HH:mm或者HH:mm:ss,直接传这种格式的字符串就行:

<div ng-app="myApp" ng-controller="myCtrl">
  <input type="time" ng-model="selectedTime">
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  // ✅ 正确格式:24小时制HH:mm
  $scope.selectedTime = "14:30";
  // ✅ 也可以带秒数:HH:mm:ss
  // $scope.selectedTime = "09:15:45";
});
</script>

2. 转换非标准格式的时间(比如12小时制转24小时制)

如果你的原始时间是带AM/PM的12小时制,先写个小工具函数转换成标准格式:

<div ng-app="myApp" ng-controller="myCtrl">
  <input type="time" ng-model="selectedTime">
</div>

<script>
var app = angular.module('myApp', []);

// 12小时制转24小时制的工具函数
function convertTo24Hour(timeStr) {
  const [time, period] = timeStr.split(' ');
  let [hours, minutes] = time.split(':');
  
  if (period === 'PM' && hours !== '12') {
    hours = String(parseInt(hours) + 12);
  }
  if (period === 'AM' && hours === '12') {
    hours = '00';
  }
  
  return `${hours}:${minutes}`;
}

app.controller('myCtrl', function($scope) {
  const originalTime = "10:30 PM";
  // 转换成标准格式"22:30"再绑定
  $scope.selectedTime = convertTo24Hour(originalTime);
});
</script>

3. 使用Date对象绑定

如果你手上有Date对象,直接绑定也可以,AngularJS会自动提取它的时间部分显示在输入框里:

<div ng-app="myApp" ng-controller="myCtrl">
  <input type="time" ng-model="selectedTime">
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  // ✅ 绑定当前时间的Date对象
  $scope.selectedTime = new Date();
  // ✅ 也可以绑定指定时间的Date对象
  // $scope.selectedTime = new Date('2024-05-20T16:45:00');
});
</script>

额外小提示

当你在输入框手动修改时间后,ngModel返回的值也会是符合ISO标准的字符串(比如你选了10:30,$scope.selectedTime可能会变成"10:30:00",具体取决于浏览器的实现),双向绑定是完全没问题的。

内容的提问来源于stack exchange,提问作者RohanSalins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:44:01