日期对象返回无效月/日的随机日期

时间:2013-06-17 09:50:02

标签: javascript date

此代码:

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

...在Firefox上为dt提供 1992年11月25日星期三00:00:00 GMT + 0530(IST)

如何?

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

2 个答案:

答案 0 :(得分: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开头。)

答案 1 :(得分:1)

我无法在 Chrome 中重新制作此内容,但我会解释 FireFox 如何到达此处。

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

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

  • 连字符-格式通常为yyyy-mm-dd
  • yy19yy
  • 的缩写
  • 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,这与你的浏览器如何计算它非常接近(它不需要估计)。