Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Clock_Hour - Fatal编程技术网

Javascript 考虑夏令时,计算两个日期之间的差异

Javascript 考虑夏令时,计算两个日期之间的差异,javascript,date,clock,hour,Javascript,Date,Clock,Hour,给定开始日期和天数,我需要显示结束日期=开始日期+天数 所以我做了这样的事情: var endDate=new Date(startDate.getTime()+ONE_DAY); 一切正常,除了10月25日和26日少一天 例: 这种差异的出现是因为时钟倒转了1小时。实际上,2014-10-27 00:00:00变成了2014-10-26 23:00:00 一个简单的解决方案是在另一个小时计算(例如上午3点)。但我只想在发生这种情况时显示一个注释 例如,如果用户输入2014-10-25,我会显

给定开始日期和天数,我需要显示结束日期=开始日期+天数

所以我做了这样的事情:

var endDate=new Date(startDate.getTime()+ONE_DAY);
一切正常,除了10月25日和26日少一天

例:

这种差异的出现是因为时钟倒转了1小时。实际上,
2014-10-27 00:00:00
变成了
2014-10-26 23:00:00

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

例如,如果用户输入
2014-10-25
,我会显示一个弹出窗口,上面写着[something]

现在真正的问题是。。。我似乎找不到任何算法能告诉我时钟何时回到X年

例如。。。2014年的这一天是10月26日。2016年是10月30日()。为什么?这个日期看起来是随机的,但我认为不是。所以时钟什么时候倒转


编辑:所有答案/评论都有助于解决问题。但是我已经通过了那个阶段。现在我只想知道“时钟改变时的天数究竟是如何计算的?”

我更喜欢用这种方式增加天数:

    var startDate = //someDate;

    var endDate = new Date(startDate.getFullYear(),
               startDate.getMonth(),
               startDate.getDate()+1);
这样你就不必担心日历上的日期了

此代码添加1天,如果您想添加更多,请更改
startDate.getDate()+1
startDate.getDate()+天数
即使您在月的最后一天,即10月31日,也可以正常工作


但也许你可以使用比我更优雅的@RobG解决方案来找出全天内两个日期之间的差异,创建日期对象,从另一个中减去一个,然后除以一天内的毫秒和整数。其余的将仅在夏令时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)。

如果您不反对使用库,我强烈推荐使用矩.js和矩时区,那么在处理此类情况时,它会带来很多麻烦()夏令时不是基于特定日期,它通常是某个月的第一个星期天的02:00,随着各地采用或停止使用它而频繁变化,或者只是改变开始的一周,因为这似乎是一个好主意。没有一致性,尽管赤道附近的国家通常不会比两极附近的国家更多地使用它。不,.getMonth()会给你以月份0为基础的指数,我的意思是从0到11,但是当你使用新的指数时,你必须把月份放在1-12:我不想骄傲,但我的链接字面上说:“定义和使用getMonth()方法根据本地时间返回指定日期的月份(从0到11)。这就是我在评论中所说的。在ECMAScript中,refence还说:“月数月由一个0到11(包括0到11)的整数标识。从时间值t到月数的映射MonthFromTime(t)定义为:“我测试了它,你说得对!我创建了新的日期(2000,1,1),它实例化了2月1日,而不是1月1日。一个神话为我而死!谢谢你提供的信息,很抱歉你这么固执!我去编辑它。顺便说一下,我更喜欢你的解决方案,它更优雅。
// 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