2014-10-06 165 views
3

给定开始日期和天数,我需要显示结束日期=开始日期+天数。考虑夏令时的两个日期之间的差异

所以我做了这样的事情:

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

一切正常,但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,我会显示一个弹出窗口说[something]。

现在,这里是真正的问题......我似乎无法找到说,任何​​算法时的时钟可以追溯到在今年十

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

编辑:所有的答案/评论有助于如何解决这个问题。但是......我已经通过了这个舞台。现在我只有一句关于“计算时钟的时间到底如何计算?”的痒痒。

+0

如果您不反对使用图书馆,我会强烈建议使用moment.js和时区时区,但在处理这些情况时会带来很多麻烦(http://momentjs.com/) – Quince 2014-10-06 07:37:11

+0

夏令时不是基于特定的日期,通常在特定月份的第一个星期日的02:00,随着地方采用或停止使用而频繁变化,或者只是更改开始的一周,因为它似乎是一个好主意。没有一致性,尽管赤道附近的国家倾向于不使用它比靠近两极的国家更多。 – RobG 2014-10-06 08:16:11

回答

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对象考虑到夏令时(认为有bug在一些浏览器中)。

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解决方案,它是更优雅比我

+0

不,.getMonth()为您提供基于月份的0-索引,我的意思是从0到11,但是当您使用新的时候,您必须将月份设置为1-12:http://www.w3schools.com/jsref/ jsref_getmonth.asp – Balder 2014-10-06 08:04:32

+0

我不想自大,但我的链接字面意思是:“定义和用法 getMonth()方法根据当地时间返回指定日期的月份(从0到11)。”这是我在评论中所说的。在ECMAScript refence中还说:“月份号 月份由0到11之间的一个整数标识(包括0和11)。从时间值t到月份号的映射MonthFromTime(t)定义为:”http:/ /ecma-international.org/ecma-262/5.1/#sec-15.9.1.4 – Balder 2014-10-06 08:45:49

+0

我测试过了,你是对的!我做了新的日期(2000,1,1),它实例化了2月1日,而不是1月1日。神话为我而死!感谢您的信息,并抱歉固执!我会去编辑它。顺便说一下,我更喜欢你的解决方案,它更优雅。 – Balder 2014-10-07 07:13:46