date-fns: parseISO(string)和new Date(string)之间的区别是什么?

23

我正在尝试使用 date-fns v2。

当我运行以下命令时,出现了一些错误:

parseISO("Apr 9, 2020, 12:00:00 am");

或者
parseISO("Apr 9, 2020, 12:00:00 am", "MMM M, YYYY, hh:mm:ss aaaa");

但这个工作得很好:

new Date("Apr 9, 2020, 12:00:00 am");

我试图理解何时应该使用其中之一,但我找不到关于parseISO()的文档。

3个回答

21

parseISO的文档在这里。基本上,parseISO试图解析包含ISO格式的日期字符串的字符串,例如'2019-09-25T14:34:32.999Z'

你要解析的是国际化字符串。即'Apr 9, 2020, 12:00:00 am'是美国地区格式的日期字符串。

new Date()之所以有效,是因为它依赖于您的环境(浏览器或节点)的语言环境,而您传递给它的字符串与您的语言环境的格式相匹配。如果您传递了法语语言环境格式的日期字符串,则很可能会失败。

要解析国际化字符串,你也可以查看parse,它将接受传递的日期字符串的格式。

如果你通过网络(如HTTP REST API或数据库)传递日期,请已经决定传递/存储日期时间的格式。通常是ISO格式的日期字符串、自1970年以来UTC中的毫秒数或其他适合你的情况。然后根据你的“线路”或“存储”的规范,你将使用parseISOnew Date(milliseconds)

如果你做的是基于浏览器的Web应用程序,则应考虑用户所在地区。然后解析可能变得繁琐,因为你必须考虑到你的用户的语言环境和/或时区。


2

Apr 9, 2020, 12:00:00 am 不符合 ISO 8601 格式,而这是 parseDate 所期望的格式。下面是一个正确的 ISO 8601 日期字符串示例:2020-11-20T10:36:01.516Z

请注意,MDN 强烈不建议使用 new Date(dateString)Date.parse(dateString)

注意:由于浏览器之间存在差异和不一致性,强烈不建议使用 Date 构造函数(以及同样工作方式的 Date.parse())解析日期字符串。

(来源)


1
当前的文档表明new Date()可靠地处理符合ISO-8601标准的字符串(引用:“const birthday = new Date("1995-12-17T03:24:00"); // 这是符合ISO-8601标准的,将可靠地工作”)。parseISO仅接受符合ISO-8601标准的字符串,但我认为它们在内部使用new DateDate.format - ArneHugo

2

初步观察:第四个大写字母M应该是小写字母d吧? 从MMM M, YYYY, hh:mm:ss aaaaMMM d, YYYY, hh:mm:ss aaaa


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接