【问题标题】:Date manipulation issues/questions using AngularJS and MomentJS使用 AngularJS 和 MomentJS 的日期操作问题/问题
【发布时间】:2015-10-31 18:17:54
【问题描述】:

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

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

我会使用 datetimepicker,但有太多可供选择的,而不是 很多时间来弄清楚哪一个可以满足我的所有需求 (验证、屏蔽、bootstrap v3、对其他日期时间选择器的依赖等)。

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

这是我遇到的一些示例...首先BeginDateEndDate 值来自Angular UI-Bootstrap DatePicker。 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 会让日期和时间变得如此难以处理? (我可以稍后用谷歌搜索 - 只是发泄一下。)

【问题讨论】:

  • 仅供参考 - 所有这些信息都是昨晚收集并于今天发布的。在今天的测试中,我发现现在的月份减少了 6 个月而不是 8 个月。

标签: angularjs angular-ui-bootstrap momentjs bootstrap-datepicker angular-moment


【解决方案1】:

我认为 Moment 语法可能有点不对劲。试试这样的:

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

【讨论】:

  • 这就是让我得到实际工作的测试代码的原因。所有日期和时间都符合预期使用此...(并且没有折旧警告) var beginDate = $scope.task.BeginDate.toString(); var beginTime = $scope.task.BeginTime.toString(); var beginDateMoment = moment(new Date(beginDate)); console.log("beginDateMoment = " + beginDateMoment.format("MM/DD/YYYY")); var beginTimeMoment = 时刻(新日期(开始时间)); console.log("beginTimeMoment = " + beginTimeMoment.format("HH:mm A"));
  • 格式在 cmets 中不能很好地工作...基本上,这里的修复是一个字符串被传递到 moment 构造函数中。我现在使用指令中的字符串,并从中创建日期对象。从那里,我使用这些日期对象来创建时刻对象。使用这种方法一切都很好。
  • @WillStrohl - 太好了,我很高兴能够为您指明正确的方向!编码愉快!
猜你喜欢
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2017-03-06
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多