使用 AngularJS 和 MomentJS 的日期操作 issues/questions

Date manipulation issues/questions using AngularJS and MomentJS

我正在使用日期选择器和时间选择器让用户选择特定的日期和时间。在我的控制器中,我打算合并所选日期和所选时间。

我使用的是 AngularJS、Bootstrap、Angular UI-Boostrap 和 MomentJS 的最新生产版本。我也添加了最新的 Angular-Moment,但不确定 if/how 它是否有助于解决下面提到的问题。

I'd use a datetimepicker, but there's too many to choose from and not a lot of time to figure out which one does everything I need (validation, masking, bootstrap v3, dependency on other datetimepickers, etc.).

在我的应用程序中,我已经包含并成功地将 MomentJS 用于其他目的,但在这种情况下,我遇到了一个问题,即日期选择器和时间选择器都返回了正确的值,但 MomentJS 返回了错误的值当我将那些 dates/times 加载到 moment() 对象中时。

这是我 运行 的一些示例...首先 BeginDateEndDate 值来自 Angular UI -Bootstrap 日期选择器。 BeginTimeEndTime来自同一个库的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 使日期和时间如此难以处理? (我可以 Google 那个以后 - 只是发泄一下。)

我认为 Moment 语法可能有点偏差。尝试这样的事情:

var beginDate = moment($scope.task.BeginDate.toString()).format("MM/DD/YYYY");