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

时间:2014-09-16 09:21:48

标签: javascript date

参考此问题的接受答案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)

2 个答案:

答案 0 :(得分:1)

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

  

如果字符串不符合该格式[ISO 8601],则该函数可以回退到任何特定于实现的启发式或特定于实现的日期格式。

请注意(正如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语言环境的日期(可能是因为他们使用的浏览器不支持启发式猜测),但这不是你应该重用的东西。

解决方案?不要手工解析日期(除非你真的非常清楚你正在做什么),为此使用一个好的库(例如moment.js)因为大多数关于日期格式化的假设都是...... < EM>错

答案 1 :(得分:-1)

我尝试将测试代码输入jsperf.com,我的机器上的结果很清楚,他们说你不应该尝试拆分字符串。

我尝试使用分裂字符串进行测试的两个测试,并且可取的是,分裂本身并不是占用时间的。

http://jsperf.com/date-from-string-or-dateparts

尝试自己