使用AngularJS和MomentJS处理日期问题
我使用日期选择器和时间选择器让用户选择特定的日期和时间。在我的控制器中,我打算合并所选日期和所选时间 我正在使用AngularJS、Bootstrap、AngularUI Boostrap和MomentJS的最新生产版本。我也添加了最新的角度力矩,但不确定它是否/如何有助于解决下面提到的问题 我会用datetimepicker,但有太多的东西可供选择,而没有 花了很多时间去弄清楚哪一个做了我需要的一切 (验证、屏蔽、引导v3、对其他日期时间选择器的依赖性等) 在我的应用程序中,我已经包括了MomentJS并成功地将其用于其他目的,但在本例中,我遇到了一个问题,日期选择器和时间选择器都返回了正确的值,但当我将这些日期/时间加载到使用AngularJS和MomentJS处理日期问题,angularjs,angular-ui-bootstrap,momentjs,bootstrap-datepicker,angular-moment,Angularjs,Angular Ui Bootstrap,Momentjs,Bootstrap Datepicker,Angular Moment,我使用日期选择器和时间选择器让用户选择特定的日期和时间。在我的控制器中,我打算合并所选日期和所选时间 我正在使用AngularJS、Bootstrap、AngularUI Boostrap和MomentJS的最新生产版本。我也添加了最新的角度力矩,但不确定它是否/如何有助于解决下面提到的问题 我会用datetimepicker,但有太多的东西可供选择,而没有 花了很多时间去弄清楚哪一个做了我需要的一切 (验证、屏蔽、引导v3、对其他日期时间选择器的依赖性等) 在我的应用程序中,我已经包括了Mom
矩()
对象中时,MomentJS返回了错误的值
以下是我遇到的一些例子。。。第一个BeginDate
和EndDate
值来自Angular UI引导数据选择器BeginTime
和EndTime
来自同一库的时间选择器
日期选择器和时间选择器示例
<!-- 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>
// 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会让日期和时间变得如此难以处理?(我可以稍后在谷歌上搜索,只是发泄一下。)我想可能是语法有点不对劲了。试试这样的方法:
var beginDate=moment($scope.task.beginDate.toString()).format(“MM/DD/YYYY”);FYI-所有这些信息都是昨天晚上收集的,今天发布的。在今天的测试中,我发现现在的月份从8个减少到了6个。这就是导致我得到实际工作的测试代码的原因。所有日期和时间都是使用此。。。(并且没有折旧警告)var beginDate=$scope.task.beginDate.toString();var beginTime=$scope.task.beginTime.toString();var beginDateMoment=时刻(新日期(beginDate));console.log(“beginDateMoment=+beginDateMoment.format”(“MM/DD/yyyyyy”);var begintimement=时刻(新日期(beginTime));console.log(“begintimement=”+begintimement.format(“HH:mm A”));格式在注释中不起作用…基本上,这里的修复方法是将字符串传递到矩构造函数中。我现在使用指令中的字符串,并从中创建日期对象。从那里,我使用这些日期对象创建矩对象。使用这种方法一切都很好。@WillStrohl-非常好,我很高兴这能为你指出正确的方向!快乐编码!