以下脚本返回20而不是21!
var d = new Date("2010/03/21");
document.write(d.getDate());
我做错了什么?这是一个JavaScript错误吗?
答案 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