新日期(2015,2,30)和新日期('2015-2-30')

时间:2016-10-25 09:26:01

标签: javascript date

上述两种新日期格式都会产生不同的结果。

new Date(2015,2,30) : Date 2015-03-29T18:30:00.000Z

new Date('2015-2-30') : Invalid Date

为什么会有所不同?

EDITS 要点: 1.第一种格式的月份索引从0开始。 2.第一种格式处理日期的溢出,因此不是测试无效日期的首选方式。

例如:new Date(2015, 1, 30) {when the user is looking for 30,Feb,2015}将转换为2015年3月1日。那是额外的日期是转发到月份。根据我的说法相当猥亵。但是,如果您写new Date("2015-2-30"){when the user is looking for 30,Feb,2015},这将是无效日期。

5 个答案:

答案 0 :(得分:2)

您使用不同类型的参数调用Date constructor

  • 在第一种情况下,您提供用于填充其字段的整数(前三个是年份,月份和月份);请注意,monthes为0索引:该字段中的值1对应于2月而不是1月

  • 在第二种情况下,您提供的String将被解析,就像传递给Date.parse一样,即ISO 8601扩展格式日期({{1} })

答案 1 :(得分:1)

Check docs

这是因为在第一个例子中你传递了参数

new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

然后通过第二个传递无效的日期字符串。在0

之前遗漏2
new Date(dateString);

答案 2 :(得分:1)

您可以通过以下方式创建新的Date

var d = new Date();
var d = new Date(milliseconds);
var d = new Date(dateString);
var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);

对于dateString,必须通过以下输入之一提供:

ISO Date    "2015-03-25" (The International Standard)
Short Date  "03/25/2015" or "2015/03/25"
Long Date   "Mar 25 2015" or "25 Mar 2015"
Full Date   "Wednesday March 25 2015"

答案 3 :(得分:0)

ECMAScript日期有一个基本规则:永远不要使用Date构造函数或Date.parse(它们等同于解析)来解析字符串。

鉴于data YourData; format date date9. ; do i=1 to 100 ; date=intnx('day', '17oct03'd,i); var=rand('uniform'); output; end; drop i; run; Data Find; set YourData; Month=month(date); day=day(date); Weekday=WEEKDAY(date); /* weekday=5 this is thursday */ if weekday=5 and month=12 then flag=1; /* flag2 retains the value */ flag2+flag; if month=12 and flag2 < 2 then Dummy=1; else if month=12 and flag2=2 and flag=1 then Dummy=1; else if month=12 then Dummy=0; else Dummy=.; run; ,这些值在2015年3月30日被视为“本地”,因此UTC时间值会根据该日期主机上的时区偏移进行调整。所有实现中的结果将与至少从ed 3开始的所有ECMAScript版本一致。

给定字符串new Date(2015,2,30),使用浏览器解析算法。该字符串可能被视为:

  1. 无效日期,这是Safari的结果,因为它类似于ISO而不是正确的格式且日期对于二月无效
  2. ISO 8601,因此 UTC 于2015年3月30日,这是Firefox中的结果,并且与标准一致,因为它不是有效的ISO 8601,因此可以通过实现希望的任何方式进行解析
  3. 2015年3月30日的本地日期,这是Chrome的结果。
  4. 另外,给定new Date('2015-3-30')

    1. Safari和Firefox提供无效日期
    2. Chrome将2015年3月2日作为本地日期(即2月30日转到3月2日,这与new Date('2015-2-30')的行为相同)
    3. 以上所有结果均与ECMAScript 2016一致。因此,开场陈述。

      修改

      在解析时验证日期值的最快方法是测试月份,最简单的方法是以d / m / y格式解析日期:

      new Date(2015,1,30)

答案 4 :(得分:-1)

输出

console.log(new Date(2015,2,30)); // here 2 represents the march, ,month starts from 0 where 0 represents first month
console.log(new Date('2015-3-30'));

Mon Mar 30 2015 00:00:00 GMT+0530 (India Standard Time)
Mon Mar 30 2015 00:00:00 GMT+0530 (India Standard Time)


new Date('2015-2-30') // it means 30th day in February; which will convert it to second march