0

这段代码:

var dt = new Date('82/66/2005');

...在 Firefox 上给出1992 年 11 月 25 日星期三 00:00:00 GMT+0530 (IST)dt的值。

如何?

小提琴 - http://jsfiddle.net/4jyT3/1/

4

2 回答 2

1

该日期不是Date构造函数指定支持的格式。我发现大多数引擎都称它无效,我并不感到惊讶,但显然 Firefox 正试图对此做出判断。即使没有指定,大多数引擎month/day/year都支持,最后我检查了一下,支持year/month/day. Firefox 似乎正在应用于year/month/day输入,大多数浏览器会看到无效值并使用“无效”。

所以 Firefox 看到82的是年(假设是 1982 年)、66月和2005日。JavaScript 通常对日期的越界值、移动到下个月等必要时非常宽容。这就是这里发生的事情:如果你取 1982 年 1 月 1 日,再加上 65 个月和 2004 天,你会在 1992 年 11 月 25 日结束。

此代码将可靠地为您提供您提到的日期:

var dt = new Date(1982, 65, 2005);

(65 而不是 66,因为在数字形式中,月份从 0 开始,但在字符串形式中,它们从 1 开始。)

于 2013-06-17T09:54:23.567 回答
1

我无法在Chrome中重新生成它,但我将解释FireFox是如何到达这里的。

new Date('82-66-2005');

日期无效,让我们根据我们对日期的了解来猜测您想要什么。

  • 连字符-格式通常是yyyy-mm-dd
  • yy简称19yy
  • 12几个月,所以月份13是明年的Januaray
  • 同样的几天

因此,使用这些知识可以估计它,假设365.25每年的30.5天数和每月的天数。

// input
var year = 1982, // 19yy
    bigMonth = 66,
    bigDay = 2005;

// adjust day for years
var day = bigDay % 365.25;
year = year + (bigDay - day) / 365.25;

// adjust day for months
bigDay = day;
day = bigDay % 30.5;
bigMonth = bigMonth + (bigDay - day) / 30.5;

// adjust month for years
var month = bigMonth % 12;
year = year + (bigMonth - month) / 12;

console.log(year, month, day); // 1992 11 26.25

所以这将是关于Nov 26th, 1992,这与您的浏览器计算它的方式非常接近(它不需要估计)。

于 2013-06-17T10:28:14.297 回答