在JavaScript中计算两个日期之间的差异时出现时区问题
我使用以下公式计算JavaScript中两个日期之间的差异:在JavaScript中计算两个日期之间的差异时出现时区问题,javascript,date,Javascript,Date,我使用以下公式计算JavaScript中两个日期之间的差异: var dateOne = new Date; // Now var dateTwo = new Date( dateOne.getTime() + 60 * 1000 ); // Now + One Minute var difference = new Date( dateTwo - dateOne ); 因此,从逻辑上讲,差异应该是一分钟。但是Firebug告诉我,时差是一个小时,时区也会发生变化 dateOne = Dat
var dateOne = new Date; // Now
var dateTwo = new Date( dateOne.getTime() + 60 * 1000 ); // Now + One Minute
var difference = new Date( dateTwo - dateOne );
因此,从逻辑上讲,差异
应该是一分钟。但是Firebug告诉我,时差是一个小时,时区也会发生变化
dateOne = Date {Sun Sep 11 2011 01:07:55 GMT+0200 (CET)}
dateTwo = Date {Sun Sep 11 2011 01:08:55 GMT+0200 (CET)}
difference = Date {Thu Jan 01 1970 01:01:00 GMT+0100 (CET)}
如何修复此问题?
Date
用于存储准确的日期和时间,而不是日期和时间之间的差异。减去这些Date
对象将得到这两个日期之间的毫秒数。然后创建一个新的日期
,该日期自历元起的毫秒数。由于纪元是1970年1月1日午夜,因此结果将是1970年1月1日凌晨12:01。夏令时稍微改变了时区。日期
用于存储准确的日期和时间,而不是日期和时间之间的差异。减去这些Date
对象将得到这两个日期之间的毫秒数。然后创建一个新的日期
,该日期自历元起的毫秒数。由于纪元是1970年1月1日午夜,因此结果将是1970年1月1日凌晨12:01。夏令时会稍微改变时区。在JavaScript中,所有时间都以GMT为单位。每次将日期转换为字符串时,时区都会“应用”到输出。因此,您可以尝试以毫秒为单位获取差异:
difference = dateTwo.getTime() - dateOne.getTime()
那显然是你加的6万
没有TimeSpan类之类的东西。日期只存储日期
编辑:如果你想知道为什么会有+2:00小时的输出,然后只有+1:00,那是因为1月1日是标准时间,而9月11日是夏季节省时间。这并不是因为JavaScript在从一个日期扣除另一个日期时做了一些有趣的事情。在JavaScript中,所有时间都以GMT为单位。每次将日期转换为字符串时,时区都会“应用”到输出。因此,您可以尝试以毫秒为单位获取差异:
difference = dateTwo.getTime() - dateOne.getTime()
那显然是你加的6万
没有TimeSpan类之类的东西。日期只存储日期
编辑:如果你想知道为什么会有+2:00小时的输出,然后只有+1:00,那是因为1月1日是标准时间,而9月11日是夏季节省时间。这并不是因为JavaScript在从一个日期推断另一个日期时做了一些有趣的事情。前面的答案很好地澄清了问题的原因,但我认为指出JavaScript同时具有“本机时区”和“UTC”方法也是有意义的:-
var dtnow = new Date();
var val1 = dtnow.getHours();
var val2 = dtnow.getUTCHours();
…如果运行该代码的计算机的本地时区不是GMT(可能是英国夏令时,即GMT+01:00),则返回值可能不同(取决于您设置的日期值以及JS引擎是否从非UTC方法返回GMT-我已经看到了差异,例如在Rhino中存在差异)
因此,出于计算目的,您可能希望使用UTC方法提取所有值,以确保所有值都基于GMT。这将使数学“技术上正确”,但对于给定目的,其语义是否正确取决于用例
例如,美国的凌晨2点与英国的凌晨2点相比,忽略时区,是0。而对于时区,它可能是6(例如)。我有时也很难做到这一点,在我走一条或另一条路线之前,我常常不得不认真思考我要实现的目标!总是烤一会儿面:-)前面的答案很好地澄清了问题的原因,但我认为指出Javascript同时具有“本机时区”和“UTC”方法也是有意义的:-
var dtnow = new Date();
var val1 = dtnow.getHours();
var val2 = dtnow.getUTCHours();
…如果运行该代码的计算机的本地时区不是GMT(可能是英国夏令时,即GMT+01:00),则返回值可能不同(取决于您设置的日期值以及JS引擎是否从非UTC方法返回GMT-我已经看到了差异,例如在Rhino中存在差异)
因此,出于计算目的,您可能希望使用UTC方法提取所有值,以确保所有值都基于GMT。这将使数学“技术上正确”,但对于给定目的,其语义是否正确取决于用例
例如,美国的凌晨2点与英国的凌晨2点相比,忽略时区,是0。而对于时区,它可能是6(例如)。我有时也很难做到这一点,在我走一条或另一条路线之前,我常常不得不认真思考我要实现的目标!总是烤一会儿面:-)您可以通过以下公式计算TZ中两个日期之间的完整验证天数差:
var开始=新日期('10/3/2015');
var结束=新日期('2015年2月11日');
风险值天数=(结束-开始)/1000/60/60/24;
控制台日志(天);
//其实是三十,;但由于夏时制,将显示31.0xxx
//您需要如下所示进行偏移
天=天-(end.getTimezoneOffset()-start.getTimezoneOffset())/(60*24);
控制台日志(天)代码>您可以通过以下公式计算TZ中两个日期之间的完整验证天数差:
var开始=新日期('10/3/2015');
var结束=新日期('2015年2月11日');
风险值天数=(结束-开始)/1000/60/60/24;
控制台日志(天);
//其实是三十,;但由于夏时制,将显示31.0xxx
//您需要如下所示进行偏移
天=天-(end.getTimezoneOffset()-start.getTimezoneOffset())/(60*24);
控制台日志(天)
你已经有时差了:是60000
@user278064你听说过“提供一个例子”这个词吗?你已经有时间了