【问题标题】:Date object is valid in Chrome but not Safari, Firefox, or IE日期对象在 Chrome 中有效,但在 Safari、Firefox 或 IE 中无效
【发布时间】:2016-04-06 00:13:53
【问题描述】:

我正在从 API 获取日期对象。以下是 API 返回的格式:

“2016-04-05 13:39:46.612”

Chrome 似乎可以解释并正确显示它,但在 Firefox、Safari 和 IE 中,我得到的不是空日期就是无效日期。

Chrome 结果:

console.log(purchaseDate) 
>> Tue Apr 05 2016 13:39:46 GMT-0500 (CDT)

Angular 视图中的此 HTML:{{$scope.purchaseDate |日期:'MMM d, y h:mm a'}} 输出:2016 年 4 月 5 日下午 1:39

Firefox 结果(Safari 和 IE 类似):

console.log(purchaseDate) 
>> Invalid Date

Angular 视图中的此 HTML:{{$scope.purchaseDate |日期:'MMM d, y h:mm a'}} 输出:空

我尝试在将日期发送到浏览器之前使用 moment.js 格式化日期(如类似问题的答案中所建议的那样),但结果并没有好多少:

Chrome 结果:

console.log(moment(purchaseDate).format()) 
>> 2016-04-05T13:39:46-05:00

Firefox 结果(Safari 和 IE 类似):

console.log(moment(purchaseDate).format()) 
>> Invalid Date

有什么想法吗?我想使用 moment.js 来获得一致的解析,因为我已经在我的代码中的其他地方使用它。

【问题讨论】:

  • 第一次调用时应该将格式传递给moment.js,否则解析字符串时只是猜测。
  • 如果这真的是直接从 API 中以字符串形式出现的格式,那么返回 API 并将其更改为类似 ISO-8601 之类的合理格式。但是,我的猜测是您已经将 API 结果解析为 Date 对象,并且您实际上正在查看 Datestring 的隐式转换。您确定这就是 API 中的确切字符串吗?查看原始 HTTP。
  • 你能影响你的 API 返回什么吗?如果是,最好的解决方案是不以这种格式返回数据,这太疯狂了。
  • 你能显示你设置purchaseDate的代码吗?
  • 好电话,@MattJohnson,原始响应实际上是“2016-04-05 13:39:46.612”。我已经更新了问题。

标签: javascript angularjs date momentjs date-formatting


【解决方案1】:

如果你要使用带角度的矩,你也应该使用angular-moment

加载您的值时,创建一个moment 对象而不是Date 对象。

var purchaseDate = moment("2016-04-05 13:39:46.612");

moment.js 已经可以识别这种特定格式,因此您在解析时无需提供格式字符串。但请注意,它将被解释为 local 时间。如果你想改为 UTC,那么:

var purchaseDate = moment.utc("2016-04-05 13:39:46.612");

无论哪种方式,您都可以使用 angular-moment 对其进行格式化:

{{$scope.purchaseDate | amDateFormat:'MMM D, Y h:mm a'}} 

Angular-moment 还提供了许多其他过滤器,您可以根据需要使用。 Check out their docs.

【讨论】:

  • 我相信角矩可以为您将字符串转换为矩。无需预处理。不过好久没用了,所以不要引用我的话。
  • @MaggiePint - 好点。它可以直接解析字符串。我认为它也适用于时刻对象或日期对象,但暂时没有测试。
  • 阅读源代码,在这个用例中看起来只是直接传递给了 moment 构造函数。因此,字符串、时刻、日期、以毫秒为单位的整数和 ASP.NET 丑陋的日期字符串应该都可以工作。如果你有几秒钟内的整数,你必须做其他事情。
【解决方案2】:

我想我遇到了类似的问题,对我来说最好的解决方案是使用 momentjs 库来解析日期字符串:

bower install --save moment

然后例如:

 $scope.purchaseDate  = moment("2016-04-05 13:39:46.612", "YYYY-MM-DD HH:mm:ss.SSS").toDate();

在此处查看解析格式:http://momentjs.com/docs/#/parsing/string-format/

以 HTML 页面为例:

{{purchaseDate | date:'medium'}}

请注意,momentjs 会处理您当地的时区,并且日期会相应更改

希望对你有帮助。

【讨论】:

  • 我试过这个确切的东西,但在 Chrome 以外的浏览器中仍然得到空/无效日期。
  • 我明白你的意思,请尝试:$scope.purchaseDate = moment("2016-04-05 13:39:46.612", "YYYY-MM-DD HH:mm:ss.SSS" ).toDate();
猜你喜欢
  • 2014-01-11
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多