我有一个网页,每天,每月和每年有三个下拉菜单.如果我使用Date带有数字的JavaScript 构造函数,那么我得到一个Date当前时区的对象:
new Date(xiYear, xiMonth, xiDate)
Run Code Online (Sandbox Code Playgroud)
给出正确的日期,但由于夏令时,它认为日期是GMT + 01:00.
这里的问题是我然后将它传递Date给Ajax方法,当日期在服务器上反序列化时,它已经转换为GMT,因此丢失了一个小时,将一天移回一.现在我可以将日,月和年单独传递到Ajax方法中,但似乎应该有更好的方法.
接受的答案指出了我正确的方向,但只是单独使用setUTCHours()改变了:
Apr 5th 00:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
至
Apr 4th 23:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
然后我还必须设置UTC日期,月份和年份以结束
Apr 5th 01:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
这就是我想要的.
在我的Java Script应用程序中,我将日期存储为如下格式:
2011-09-24
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用上面的值来创建一个新的Date对象(所以我可以以不同的格式检索日期)时,日期总会在一天后返回.见下文:
var doo = new Date("2011-09-24");
console.log(doo);
Run Code Online (Sandbox Code Playgroud)
日志:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
Run Code Online (Sandbox Code Playgroud) 我从我的控制器发送这个日期在java(Spring-MVC)中的类型mysql是datetime
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "..") public Date getYy() {
return this.yy;
}
Run Code Online (Sandbox Code Playgroud)
如: [2015-09-30 00:00:00.0]
当我用ajax得到这个日期时1443567600000:
new Date(1443567600000) 转换成 Tue Sep 29 2015 23:00:00 GMT+0000 (Maroc)
那么为什么我的错误约会一小时呢?
解
我们解决它
d = new Date(value) ;
d.setTime( d.getTime() - new Date().getTimezoneOffset()*60*1000 );
Run Code Online (Sandbox Code Playgroud)
因为它是夏令时(DST)或夏令时问题.好文章
我在javascript new Date()对象上阅读了许多关于夏令时时间线的 StackOverflow问题- 就像它们被越过时一样.但是,我还没有看到关于这个特定问题的答案,或者在仍然依赖 'unix time'的情况下解决它的方法.
我个人选择通过将javascript日期作为日期传递给我的PHP代码而不是unix时间来解决此问题.然而,唠叨的问题仍然存在!我已经在IE8,Chrome和FF上确认了这种行为,所以我假设它会对你的行为相同.(更新: OSX用户可能无法生成此行为)
我的研究; 对我的问题最近的问题:
getTimezoneOffset"片状",这使我无法深入研究.我已经在2006年11月1日左右生成了测试场景.根据您所在的时区,这可能会或可能不会对您有所帮助.如果我正确理解了javascript方面,您需要将PC的时钟同步到
东部时间(美国和加拿大)并选中"自动调整夏令时的时钟".
我将这个实验基于PHP的"印第安纳波利斯"时区.我的javascript结果,当我发现2006年11月1日的unix时间与PHP生成的时间相差一小时(3600秒).根据这个页面(谢谢乔恩!)javascript是错误的.
这两种语言的结果" 于2006年6月11日重新达成协议!
这和其他的研究使我相信,得到的Javascript的历史错误,选择了错误的周日"依傍"了DST的 - 从而导致我看到的差异.
我试图尽可能地简化这个,但仍然有相当多的齿轮在运动.
1)这是PHP代码和输出,显示直到11/01/2006日期之前的CORRECT毫秒数.
date_default_timezone_set("America/Indiana/Indianapolis");
echo "Unixtime for November 1, 2006 is: ".strtotime("11/01/2006")."\n";
echo "Unixtime for November 6, 2006 is: ".strtotime("11/06/2006");
Run Code Online (Sandbox Code Playgroud)
结果是:
Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
Unixtime for November 6, 2006 is: 1162789200
Run Code Online (Sandbox Code Playgroud)
它们都基于GMT-0500.
2)在Javascript中,(请参阅我的 …