gpt4 book ai didi

Javascript: `new Date(dateString)` 与 `new Date(year, month, day)` 之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:52 24 4
gpt4 key购买 nike

引用这个问题的公认答案How do I get the number of days between two dates in JavaScript? .我看到,在函数 parseDate 中:

function parseDate(str) {
var mdy = str.split('/')
return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

他是这样做的:

var mdy = str.split('/')
return new Date(mdy[2], mdy[0]-1, mdy[1]);

即将传递的日期拆分为月、日和年,然后将其传递给 Date,例如 new Date(year, month, day) 而他可以简单地执行 new Date(str) 并且它会返回相同的结果(不是吗?)。任何人都可以解释这两种方式之间的区别吗?

更新:测试结果:

var str = '1/1/2000'
var mdy = str.split('/')
console.log( new Date(str) ) // Sat Jan 01 2000 00:00:00 GMT+0500 (Pakistan Standard Time)
console.log( new Date(mdy[2], mdy[0]-1, mdy[1]) ); // Sat Jan 01 2000 00:00:00 GMT+0500 (Pakistan Standard Time)

最佳答案

不,它们不一样(即使假设您将在一个月后减去:他在做 mdy[0] - 1 )因为 new Date(str)需要(按标准,请参阅 §15.9.4.2)仅接受特定格式的日期 ISO 8601( YYYY-MM-DDTHH:mm:ss.sssZ ,另请参阅 this post ,我不会在这里重复):

If the String does not conform to that format [ISO 8601] the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

请注意(如 Royi 在 comments 中指出的那样)还应支持 RFC 2822 (根据 MDN ),但在 JavaScript specifications 中未提及并且 Internet Explorer 不正式支持它(参见 MSDN ,它可以解析一些相似但不相同的东西)。

在该代码中,他们使用特定的语言环境规则进行解析( MM/DD/YYYY ,我想是 en-US 语言环境,但它不仅仅是一个)。老实说,我什至不会使用该代码进行解析(因为是的,实际上它会因不同的语言环境而被破坏:即使用于拆分的分隔符也不是“语言环境安全的”)。让我用一个例子来解释:

  • 您使用的是正确配置的日期时间选择器(或 <input type="date"/>,如果支持),您将根据您的语言环境输入日期。例如在意大利(但通常在欧洲)我们写 DD/MM/YYYY .
  • 现在假设用户选择了 21 December 2014 (格式为 21/12/2014 根据他的语言环境)。
  • 对于字符串拆分,该代码将失败(因为它会选择 21 作为月份编号,显然它是无效的)。更糟糕的是,此类错误甚至可能会被忽视(例如,如果用户选择 1/2/2014,代码将“认为”它是 2nd Jan,但用户选择了 1st Feb)。你想让它更复杂吗?连new Date(str)可能会失败,因为它依赖于浏览器(而且您不能真正相信启发式是可移植和安全的)。

如果您问自己“那他们为什么使用这样的代码?”我想说他们使用了一种快速解决方法来支持使用 en-US 区域设置的日期(可能是因为他们使用的浏览器不支持它们的启发式猜测),但这不是您应该重用的东西。 p>

解决方案?永远不要手动解析日期(除非你真的很清楚自己在做什么),为此使用一个好的库(例如 moment.js ),因为你可能对日期格式所做的大多数假设是......错了

关于Javascript: `new Date(dateString)` 与 `new Date(year, month, day)` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25865051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com