【发布时间】:2015-10-31 18:17:54
【问题描述】:
我正在使用日期选择器和时间选择器让用户选择特定的日期和时间。在我的控制器中,我打算将选定的日期和选定的时间结合起来。
我正在使用 AngularJS、Bootstrap、Angular UI-Boostrap 和 MomentJS 的最新生产版本。我也添加了最新的 Angular-Moment,但不确定它是否/如何有助于解决下面提到的问题。
我会使用 datetimepicker,但有太多可供选择的,而不是 很多时间来弄清楚哪一个可以满足我的所有需求 (验证、屏蔽、bootstrap v3、对其他日期时间选择器的依赖等)。
在我的应用程序中,我已将 MomentJS 包含并成功用于其他目的,但在这种情况下,我遇到了一个问题,即 datepicker 和 timepicker 都返回了正确的值,但是 MomentJS 在我返回错误的值时将这些日期/时间加载到 moment() 对象中。
这是我遇到的一些示例...首先BeginDate 和EndDate 值来自Angular UI-Bootstrap DatePicker。 BeginTime 和 EndTime 来自同一个库的 TimePicker。
DatePicker 和 TimePicker 示例
<!-- datepicker nearly mirrors the example on the ui-bootstrap docs -->
<uib-timepicker ng-model="task.BeginTime" ng-change="TimeChanged()" hour-step="hourSteps" minute-step="minuteSteps" show-meridian="true" required></uib-timepicker>
JS 控制台输出示例
// returns correct value: Wed Nov 04 2015 00:00:00 GMT-0800 (Pacific Standard Time)
console.log("$scope.task.BeginDate = " + $scope.task.BeginDate.toString());
// 11/04/2015 selected
// returns correct value: Sat Oct 31 2015 08:00:52 GMT-0700 (Pacific Daylight Time)
console.log("$scope.task.BeginTime = " + $scope.task.BeginTime.toString());
// 08:00 PM selected
// returns correct value: Wed Nov 04 2015 00:00:00 GMT-0800 (Pacific Standard Time)
console.log("$scope.task.EndDate = " + $scope.task.EndDate.toString());
// 11/04/2015 selected
// returns correct value: Sat Oct 31 2015 09:00:52 GMT-0700 (Pacific Daylight Time)
console.log("$scope.task.EndTime = " + $scope.task.EndTime.toString());
// 09:00 PM selected
当我让 MomentJS 帮助我解析和连接日期和时间时,这种情况会变得更糟。 (我尝试过使用和不使用.toString()。我的测试中的下一行如下:
// returns: 04/20/2015
var beginDate = moment($scope.task.BeginDate.toString(), "MM/DD/YYYY");
console.log("beginDate = " + beginDate.format("MM/DD/YYYY"));
// returns: Invalid date
var beginTime = moment($scope.task.BeginTime.toString(), "HH:mm A");
console.log("beginTime = " + beginTime.format("HH:mm A"));
// returns: 04/20/2015
var endDate = moment($scope.task.EndDate.toString(), "MM/DD/YYYY");
console.log("endDate = " + endDate.format("MM/DD/YYYY"));
// returns: Invalid date
var endTime = moment($scope.task.EndTime.toString(), "HH:mm A");
console.log("endTime = " + endTime.format("HH:mm A"));
如果我现在结合日期和时间,我当然会返回 04/20/2015 00:00 AM。
为什么日期要提前 8 个月?
为什么加载到 MomentJS 后时间是无效日期?
你建议我如何解决这个问题?
到底为什么 JavaScript 会让日期和时间变得如此难以处理? (我可以稍后用谷歌搜索 - 只是发泄一下。)
【问题讨论】:
-
仅供参考 - 所有这些信息都是昨晚收集并于今天发布的。在今天的测试中,我发现现在的月份减少了 6 个月而不是 8 个月。
标签: angularjs angular-ui-bootstrap momentjs bootstrap-datepicker angular-moment