计算考虑夏令时的2个日期之间的差异

时间:2014-10-06 07:31:05

标签: javascript date clock hour

考虑到开始日期和天数,我需要显示结束日期=开始日期+天数。

所以我做了这样的事情:

var endDate=new Date(startDate.getTime()+ONE_DAY);

一切正常,但10月25日和26日减少了一天。

例:

2014-01-01 + 2 days = 2014-01-03

2014-10-25 + 2 days = 2014-10-26 (here is the case I need to treat).

这种差异的出现是因为时钟可以追溯到1小时。实际上2014-10-27 00:00:00变为2014-10-26 23:00:00

一个简单的解决方案是在另一个小时(例如凌晨3点)进行计算。但是我想在发生这种情况时只显示一个注释。

例如,如果用户输入2014-10-25,我会显示一个弹出窗口,说[某事]。

现在这是真正的问题......我似乎无法找到任何算法,说明时钟在X年回归。

示例...... 2014年当天是10月26日。 2016年是10月30日(https://www.gov.uk/when-do-the-clocks-change)。为什么?这个日期看起来是随机的,但我认为不是。那么......时钟何时返回/前进?

编辑:所有答案/评论都与如何解决问题有关。但是......我已经过了那个阶段。现在我只有一个关于“计算时钟变化的日子怎么样?”的痒。

2 个答案:

答案 0 :(得分:2)

要查找整天中两个日期之间的差异,请创建日期对象,从另一个中减去一个,然后在一天内舍入毫秒数。剩下的只有1小时才能用于夏令时,所以会四舍五入到正确的值。

您可能还需要一个小函数将字符串转换为日期:

// Return Date given ISO date as yyyy-mm-dd
function parseISODate(ds) {
  var d = ds.split(/\D/);
  return new Date(d[0], --d[1], d[2]);
}

获得天数差异:

function dateDiff(d0, d1) {
  return Math.round((d1 - d0)/8.64e7);
}

// 297
console.log(dateDiff(parseISODate('2014-01-01'), parseISODate('2014-10-25')));

如果您想将日期添加到日期,请执行以下操作:

// Add 2 days to 2014-10-25
var d = new Date(2014, 9, 25);
d.setDate(d.getDate() + 2);

console.log(d);   // 2014-10-27

内置的Date对象考虑了夏令时(以为某些浏览器中存在错误)。

答案 1 :(得分:1)

我更喜欢这样添加日子:

    var startDate = //someDate;

    var endDate = new Date(startDate.getFullYear(),
               startDate.getMonth(),
               startDate.getDate()+1);

通过这种方式,您不必担心日历中的日子。

此代码会添加1天,如果您想要添加更多内容,请更改startDate.getDate()+1 startDate.getDate()+NUMBER_OF_DAYS,即使您是在月份的最后一天,即10月31日,它也能正常工作。

但也许你可以使用比我更优雅的@RobG解决方案