Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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,我使用以下公式计算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

我使用以下公式计算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 = 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你听说过“提供一个例子”这个词吗?你已经有时间了