JavaScript getDate返回错误的日期

时间:2010-03-21 19:03:50

标签: javascript getdate

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

var d = new Date("2010/03/21");
document.write(d.getDate());

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

12 个答案:

答案 0 :(得分:52)

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
}

答案 1 :(得分:29)

这是夏令时问题,因为日期()使用当地时间。

我住在巴西,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());

产生 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() );

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

答案 2 :(得分:15)

是否有可能将字符串参数视为UTC,将生成的Date对象视为本地时间,反之亦然?这可能会把它扔掉。将d.getDate()d.getUTCDate()进行比较。

答案 3 :(得分:4)

我也会在getDate()之间偏离一天,但我注意到getUTCDate()会返回预期值。问题出现在FF 3.6.12中,但Chrome上运行的代码相同。

我的调试代码:

var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());

这给出了输出(FireFox):

  

2010年11月3日星期三:3 UTC 4

Chrome很好。所以某些东西出现了 - 可能是一个错误,但更可能是时区/ UTC参数问题。让我想起如果当天时区改变那么PHP date()将在一天内返回23小时等等。如果我知道它是什么的话,会发生错误。

答案 4 :(得分:2)

我在浏览器的地址栏中写了以下代码,结果是21

javascript:alert(new Date("2010/03/21").getDate())

没有Javascript错误,因为有很多Javascript实现,所以你需要引用一个特定的实现。

我测试的实施是Chrome 4.1.249。你的是什么?

答案 5 :(得分:1)

我在Firefox 3.6和IE 8中测试了这段代码:

<script type="text/javascript">

var d = new Date("2010/03/21");
document.write(d.getDate());

</script> 

它显示了正确的日期:21

有关详细信息,请查看:JavaScript Date Object

您还可以阅读维基百科上的JavaScript Compatibility considerations

答案 6 :(得分:1)

此处是时区的主要部分。 Date()函数会将您的时区添加到您输入的日期中。例如:我这样输入:

alert(new Date("2018-09-15"));

对我来说结果是: 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 。像这样:
    日期(“ 2010-03-21T00:00:00”)。

答案 7 :(得分:0)

http://jsbin.com/aqoki3/edit - 这里有您发布的代码,我得到21。所以它不是JS的bug。也许是你的浏览器实现中的错误(JS) 因此,要正确初始化日期变量,请使用new Date(year, month, date [, hour, minute, second, millisecond ])https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date)。 这样你就可以确定那天是21,因为你隐含地将它设置为21。

答案 8 :(得分:0)

我在firfox,safari,chrome,opera和IE中获得相同的日期(21), 我是否使用字符串“2010/03/21”或整数日期参数(2010,2,21)。

我正在使用Windows机器和新版本的浏览器 -

你可以测试你的客户端是否从字符串中解析出不同的日期, 这是我看到问题的唯一地方。

if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
} 

答案 9 :(得分:0)

确保您使用的月份数为-1,如果您正在查看6月,则需要执行(6-1)该月份的创建时间

   var date_obj = new Date(y,(m-1),d);

答案 10 :(得分:0)

当给新日期一个字符串日期时,字符串需要包含时区,否则它将被解释为不同于浏览器到其他(由于不同的javascript实现)和从机器到其他(由于本地时区的差异) )

new Date('2017-07-31T10:00:00-0500');

而不是

new Date('2017-07-31T10:00:00');

答案 11 :(得分:-3)

您无法通过传递字符串参数显示日期来创建Date对象。

以这种方式创建。

var str_date = "2010/03/21";
var date = new Date();
var date_elements = str_date.split("/");

date.setYear(date_elements[0]);
date.setMonth(date_elements[1]);
date.setDay(date_elements[2]);

alert(date.toString);

注意date.toString方法。它返回完整日期字符串。 date.getDate只会在那一天给你一天。

有关Date对象的更多信息,请访问www.w3school.com