Date(dateString) 和 new Date(dateString) 的区别

IT技术 javascript date
2021-01-22 07:00:03

我有一些尝试解析日期字符串的代码。

当我做alert(Date("2010-08-17 12:09:36")); 它正确解析日期和一切工作正常,但我不能把相关联的方法Date,像getMonth()

当我尝试:

var temp = new Date("2010-08-17 12:09:36");
alert(temp);

我收到“无效日期”错误。

关于如何使用 new Date() 解析“2010-08-17 12:09:36”的任何想法?

6个回答

日期()

有了这个,你可以调用一个名为Date(). 它不接受任何参数并返回一个表示当前日期和时间的字符串。

新日期()

有了这个,您将创建一个新的 Date 实例。

您只能使用以下构造函数:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

因此,2010-08-17 12:09:36不允许用作构造函数的参数。

w3schools


编辑:new Date(dateString)使用以下格式之一:

  • “1975 年 10 月 13 日 11:13:00”
  • “1975 年 10 月 13 日 11:13”
  • “1975 年 10 月 13 日”
同样在 chrome 和 firefox 中, new Date() 的工作方式不同。例如“yyyy-mm-dd hh:mm:ss”适用于chrome,但不适用于firefox。
2021-03-14 07:00:03
没有其他方法可以在不创建我自己的日期解析器的情况下处理字符串吗?
2021-03-15 07:00:03
@FelixKling,您忘记使用“new”关键字调用 Date 。new Date('2014-05-01 00:00:00') 确实为您提供了正确的 5 月 1 日日期。
2021-03-19 07:00:03
我不知道如何使用本机 js 做到这一点。但是您可以使用外部解析器,例如 datejs ( datejs.com )
2021-04-06 07:00:03
“它接受格式为“yyyy-mm-dd hh:mm:ss”的日期“也许这在 4 年前是正确的,但今天不再如此。在 Chrome 和 Firefox 中Date('2014-05-01 00:00:00')简单地返回当前日期/时间。
2021-04-11 07:00:03

以下格式适用于所有浏览器:

new Date("2010/08/17 12:09:36");

因此,要使yyyy-mm-dd hh:mm:ss格式化的日期字符串与浏览器完全兼容,您必须用斜杠替换破折号:

var dateString = "2010-08-17 12:09:36";
new Date(dateString.replace(/-/g, "/"));
+1:在 IE5-11 中为我工作,并且在转换 ISO-8601 样式字符串日期时似乎是最简单的解决方案。
2021-04-05 07:00:03
不,不要那样做。更好地实现一个 2 行函数来手动解析字符串(或使用库,但不是必需的)。语言规范确实指出要求浏览器解析除 ISO 8601 格式之外的任何字符串,有些也不支持。
2021-04-05 07:00:03

我知道这是旧的,但到目前为止更简单的解决方案是使用

var temp = new Date("2010-08-17T12:09:36");
仅仅因为它在 Safari 中失败并不意味着它没有正确使用 JavaScript。我也没有 Safari 来测试这个,但我不知道为什么这种无处不在的东西会在某些浏览器中运行,而在其他浏览器中不起作用。无论如何,它绝对不值得投反对票。
2021-03-14 07:00:03
@TheComposer——欢迎来到浏览器脚本的世界。在 ES5 之前,标准没有要求浏览器解析的字符串。其中一些浏览器仍在使用中。可以肯定的是,在任何时候都有一些浏览器不完全支持最新的标准(甚至是几年前的),因此您必须针对浏览器支持的最低公分母进行编程,而不是严格按照当前规范的规定。
2021-03-21 07:00:03
出于充分的理由(例如“浏览器 X 不支持该格式”),非常广泛地建议不要使用 Date 构造函数解析字符串。
2021-03-24 07:00:03
OP 甚至从未提到他在浏览器中编程。它适用于 Node 和多个主流浏览器,并在 W3 和 Mozilla 文档中的示例中使用。因此,我坚持我的主张,即虽然知道它在这个或那个中失败是一个很好的信息,但它确实在合理的假设范围内正确回答了这个问题,并且仍然不值得投反对票。
2021-03-31 07:00:03
这在 Safari 中失败。
2021-04-07 07:00:03

不同之处在于(如果我从 ECMA 文档中回忆)Date("xx")它不会创建(在某种意义上)一个新的日期对象(实际上它相当于调用 ( new Date("xx").toString()))。而new Date("xx")实际上会创建一个新的日期对象。

想要查询更多的信息:

查看http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf 的15.9.2

关于如何使用 new Date() 解析“2010-08-17 12:09:36”的任何想法?

在 ES5 之前,没有要求浏览器支持的字符串格式,尽管有一些被广泛支持的数字。然而,浏览器支持是不可靠和不一致的,例如有些会允许越界值而有些则不会,有些支持某些格式而有些则不支持,等等。

ES5 引入了对某些 ISO 8601 格式的支持,但是 OP 不符合 ISO 8601 并且并非所有使用的浏览器都支持它。

唯一可靠的方法是使用一个小的解析函数。下面解析 OP 中的格式并验证值。

/* Parse date string in format yyyy-mm-dd hh:mm:ss
** If string contains out of bounds values, an invalid date is returned
** 
** @param {string} s - string to parse, e.g. "2010-08-17 12:09:36"
**                     treated as "local" date and time
** @returns {Date}   - Date instance created from parsed string
*/
function parseDateString(s) {
  var b = s.split(/\D/);
  var d = new Date(b[0], --b[1], b[2], b[3], b[4], b[5]);
  return d && d.getMonth() == b[1] && d.getHours() == b[3] &&
         d.getMinutes() == b[4]? d : new Date(NaN);
}
  
document.write(
  parseDateString('2010-08-17 12:09:36') + '<br>' +  // Valid values
  parseDateString('2010-08-45 12:09:36')             // Out of bounds date
);