【问题标题】:Why New Date() is always return null?为什么 New Date() 总是返回 null?
【发布时间】:2017-05-25 18:55:44
【问题描述】:

如果日期格式是$scope.timestamp = '2016-12-16 07:02:15 am'

我想格式化为16/12/2016 07:02:15 am

我已经尝试了下面的代码,它运行良好

$scope.originalStamp = $filter('date')
                          (new Date($scope.timestamp.replace("-","/")),'dd-MM-yyyy HH:mm:ss a');

但我的问题是为什么 new Date($scope.timestamp) 总是返回 null 如果我不使用将字符从 (-) 替换为 (/)?

如果不使用replace().,请参阅下面的代码不起作用

$scope.originalStamp = $filter('date')
                              (new Date($scope.timestamp),'dd-MM-yyyy HH:mm:ss a');

如果日期格式有 (-),为什么 new Date() 不接受? new Date() 转换是否取决于我的系统日期格式?

【问题讨论】:

  • 您根本不应该使用 Date 构造函数来解析字符串。编写一个小函数或使用库。它不应该返回 null,而是返回一个无效的 Date(即时间值为 NaN 的 Date 对象),稍后可能会被解释为 null
  • 你试过 01-01-2016 吗?
  • 'yyyy-MM-dd HH:mm:ss a',不是'dd-MM-yyyy HH:mm:ss a'
  • @AtaurRahmanMunna——你读过 OP 吗?
  • @RameshRajendran — 在实现中可能会认为“2016/12/16”是对 ISO 8601 日期字符串的无效尝试并返回 NaN,或者它可能会认为它是不是 ISO 8601 并回退到它想要的任何启发式方法,可能会返回 2016 年 12 月 16 日的日期。这两种行为都与 ECMA-262 一致。

标签: javascript angularjs date format


【解决方案1】:

如果日期格式有 (-),为什么 new Date() 不接受?

ISO 8601 included in ECMA-262 的有限子集以外的日期字符串的解析取决于实现。您可能会得到正确的结果、错误的结果或无效的日期。因此强烈建议不要使用 Date 构造函数或 Date.parse 来解析字符串(它们等效于解析),始终使用库或定制函数手动解析字符串.

new Date() 转换是否取决于我的系统日期格式?

没有。约定支持多种格式(请参阅MDN Date),但是您不应依赖这些格式,因为某些浏览器会解析或解析不同的格式,而其他浏览器则不会。

您可以尝试以下库之一:

  1. Moment.js:解析、格式化、算术、操作
  2. Fecha.js: 只是解析和格式化

PS

如果您只想将“2016-12-16 07:02:15 am”重新格式化为“16/12/2016 07:02:15 am”,那么:

// Reformat a date like '2016-12-16 07:02:15 am' as
// '16/12/2016 07:02:15 am'
function reformatDate(s) {
  var b = s.split(/[ -]/);
  return [b[2],b[1],b[0]].join('/') + ' ' + b[3] + ' ' + b[4];
}
 
var s = '2016-12-16 07:02:15 am';
console.log(s + ' => ' + reformatDate(s))

【讨论】:

  • 很好。 +1。如果 Date 被调用为具有多个参数的构造函数,如果值大于它们的逻辑范围(例如,提供 13 作为月份值或 70 作为分钟值),则将调整相邻值。例如。 new Date(2013, 13, 1) 等价于 new Date(2014, 1, 1),两者都为 2014-02-01 创建一个日期(注意月份是从 0 开始的)。其他值也类似:new Date(2013, 2, 1, 0, 70) 等价于 new Date(2013, 2, 1, 1, 10),它们都为 2013-03-01T01:10:00 创建日期。
  • @RameshRajendran——是的,但这是一个非常有用的功能。 ;-)
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2014-09-12
  • 2019-09-18
  • 2014-09-02
  • 2015-02-27
  • 2021-01-10
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多