JavaScript的getDate返回错误的日期

Vah*_*idN 46 javascript getdate

以下脚本返回20而不是21!

var d = new Date("2010/03/21");
document.write(d.getDate());
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?这是一个JavaScript错误吗?

CMS*_*CMS 51

Date.parse方法依赖new Date(string)于实现(相当于Date.parse(string)).

虽然此格式可在现代浏览器上使用,但您无法100%确定浏览器将完全解释您所需的格式.

我建议你操纵你的字符串,并使用Date构造函数与年,月和日参数:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现使用新日期("2010-03-21T00:00:00")会返回正确的日期.注意T00:00:00添加时间戳. (4认同)
  • @Arendax,Javascript Date 对象上的月份是从零开始的,意味着 0=Jan、1=Feb、2=Mar 等... (2认同)

Pau*_*aum 30

这是夏令时问题,因为Date()使用当地时间.

我住在巴西,10月21日至2012年是我国大部分地区夏令时的开始,因此巴西不存在2012年10月21日0:0和1:0之间的当地日期!

有些人在这里评论说它有效.这是因为正确或错误的小时返回取决于本地用户所在国家/地区.

请参阅:http://www.timeanddate.com/news/time/brazil-dst-2012.html

在巴西,2012年Java认为DST从10月14日开始(实际上是在1周后开始)

var dt = new Date(2012,9,14); 
alert(dt.getHours());
Run Code Online (Sandbox Code Playgroud)

产生1

请参阅:http://www.timeanddate.com/time/dst/2013.html

解决方案是使用UTC(协调世界时)时间,因为没有夏令时更改并且您使用一种抽象时间.在大多数实际应用中没有问题.

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );
Run Code Online (Sandbox Code Playgroud)

如果有人不使用小时,分钟和秒钟,只需将虚拟小时值设置为大于或等于1,就会更容易,如上所示.

  • 我同意这个问题与DST有关,但是您在示例中犯了错误。请记住,在JavaScript Date构造函数中,月份从0开始,因此,如果您要引用2012年10月21日,则必须创建:`new date(2012,9,21);` (2认同)

eye*_*ess 15

有没有机会将字符串参数视为UTC,将结果Date对象视为本地时间,反之亦然?这可能会把它扔掉.比较d.getDate()d.getUTCDate().


小智 9

时区在这里起着重要作用。该Date()函数会将您的时区添加到您作为输入提供的日期中。例如:我给出了这样的输入:

alert(new Date("2018-09-15"));
Run Code Online (Sandbox Code Playgroud)

我的结果是:

2018 年 9 月 15 日星期六 05:30:00 GMT+0530(印度标准时间)

时区+05:30被添加到我输入的时间(你可以在上面的结果中看到..05:30:00 被添加到日期。现在我要说的是如果你在时区小于 0 [国家如巴西、墨西哥、智利等......时区小于 0] 然后它将添加到您的日期输入中(例如:时区是 UTC?05:00。它将从给定的日期中减去 -5:00。

VahidN,您得到结果20是因为您所在的时区小于 0(-1è : 00` 等...)

解决方案是将您的时区重置为 0。像这样:

Date("2010-03-21T00:00:00").
Run Code Online (Sandbox Code Playgroud)