Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么新的日期设定为今天会返回昨天_Javascript_Date - Fatal编程技术网

Javascript 为什么新的日期设定为今天会返回昨天

Javascript 为什么新的日期设定为今天会返回昨天,javascript,date,Javascript,Date,这是我第一次得到这个结果 我正在使用Telerik控件RadDatePicker,并在客户端分配日期 问题是控件不接受字符串作为日期,而是接受javascript中的日期对象 因此,我在控件中设置日期的代码是 var radDateControl = $find("radDateControl"); radDateControl.set_selectedDate(new Date('2016-04-26')); 但是,我意识到新的日期将返回昨天的日期!为什么? 现在是东部时间(美国和加拿大)下

这是我第一次得到这个结果

我正在使用Telerik控件RadDatePicker,并在客户端分配日期

问题是控件不接受字符串作为日期,而是接受javascript中的日期对象

因此,我在控件中设置日期的代码是

var radDateControl = $find("radDateControl");
radDateControl.set_selectedDate(new Date('2016-04-26'));
但是,我意识到新的日期将返回昨天的日期!为什么?

现在是东部时间(美国和加拿大)下午5点58分。如果我这样做

alert(new Date('2016-04-26'));
我明白了

Mon Apr 25 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
为什么以及如何才能得到今天的这一天


更新

我最后做的就是这个。希望它能帮助别人

var dateAsString = "2016-04-26";
var year = dateAsString.split('-')[0];
var month = dateAsString.split('-')[1];
var day = dateAsString.split('-')[2];
var date = new Date(Date.UTC(year, month - 1, day, 0,0,0));
date.setTime(date.getTime() + date.getTimezoneOffset() * 60 * 1000);
rpdDateControl.set_selectedDate(date);

新创建的日期对象完全正确。这里的错误部分,或者至少让你困惑的部分是你的浏览器,它将日期对象解析为你当前的时区

如果创建新的日期对象并将其保存到变量中

var date = new Date('2016-04-26');
。。。你会得到你所要求的。表示2016年4月26日的日期对象(在UTC中)

由于您使用浏览器获取日期对象值,因此仅通过本地时区解析该值(在您的示例中为东部夏时制)。因此,如果要处理用于创建新日期对象的正确日期,可以使用
.toutString()


我知道,解析时区确实令人沮丧。为了处理不同的时区,您可以尝试或。我想这个时刻应该适合你们的需要,但只是为了完成任务。

用Date.now()来代替。我不确定字符串为什么不起作用,但这无论如何都会起作用。

你问的是日期26,但随着时区的改变,它会给你2个小时的时间,为什么不仅仅是
警报(new date())
并让它给你它的当前日期?,还要检查它,使用ssh转到服务器并键入日期,如果它不是你的日期,你可以使用tzselect将服务器修改为你的日期

该日期显然在午夜被解析为UTC日期,因此在你的东部时间时区中,它看起来像“昨天”,由于您比UTC晚4小时(给定DST)。您可以使用世界时而不是本地时间,如var utcDate=新日期(Date.UTC(2016,4,26,0,0,0));仍在获取带有时区的日期对象!这是来自Chrome控制台的:新日期(Date.UTC(2016,04,26,0,0,0))Wed May 25 2016 20:00:00 GMT-0400(东部夏令时)@joshlee,它将返回与
新日期('2016-05-26')
(在一致性实施中)完全相同的日期,因为“2016-05-26”应被视为UTC(与ISO 8601相反)。@Aer0实际上是正确的,但无论哪种方法都会奏效,这很奇怪。我在一个JSFIDLE中测试了您告诉我的内容,它成功了,但在我的应用程序中没有。我只是在窗口的onload事件中做同样的事情,但我的可变日期仍然是昨天!我不能使用toutString()方法,因为我正在使用的控件只接受日期对象,而不接受字符串。您能在浏览器开发人员控制台上运行这个fiddle中的代码吗?当然,输出会很有趣。是的,是“2016年4月26日星期二00:00:00 GMT”。即使我不使用ToutString,它也能工作。但在我的应用程序中却没有。我正在使用VS2012、Embeded IIS(ASP.NET开发服务器)和Chrome。通过少量搜索,我找到了以下内容:。您可以尝试将从日期选择器获取的日期传递到JavaScripts native date()函数中。如果连这都不起作用,你可能不得不环顾谷歌来解决这个问题。很抱歉,我无法提供更多帮助,我不认为该工具会有时区问题。但正如我在回答中提到的那样,这真的可能是一团糟“…该值只是通过本地时区进行解析…”不,不是。对字符串进行解析以获取一些值,然后使用这些值创建日期对象。这些值被视为UTC。主机时区是在输出日期值时考虑的,而不是在创建内部时间值时考虑的。