确定2个日期之间经过的时间

时间:2012-10-04 19:09:41

标签: javascript

我正在尝试使用javascript确定两个日期之间的时间。一个例子是:“我在2008年1月5日下午3点戒烟,自退出以来已经过了多少年,几个月和几个小时?”。

所以我的想法是:

  1. 获取“退出”日期
  2. 获取当前日期
  3. 转换为时间(毫秒)
  4. 找出差异
  5. 使用差异
  6. 创建新日期
  7. 从该日期开始提取年份,月份等
  8. 嗯,这很奇怪,我无法指出原因。有什么见解吗?

    //create custom test date
    var d1 = new Date(2012, 8, 28, 13, 14, 0, 0);
    //create current date
    var d2 = new Date();
    //get date times (ms)
    var d1Time = (d1.getTime());
    var d2Time = (d2.getTime());
    //calculate the difference in date times
    var diff = d2 - d1;
    //create a new date using the time differences (starts at Jan 1, 1970)
    var dDiff = new Date();
    dDiff.setTime(diff);
    //chop off 1970 and get year, month, day, and hour
    var years = dDiff.getFullYear() - 1970;
    var months = dDiff.getMonth();
    var days = dDiff.getDate();
    var hours = dDiff.getHours();
    

    您可以在this temporary host处看到它。

5 个答案:

答案 0 :(得分:0)

为什么不用数学来计算值?当您执行dDiff.setTime(diff);时,您所投入的日期对您来说毫无意义。这只是给你一个纪元日期diff ms。

答案 1 :(得分:0)

更改部分代码可能会解决您的问题。 jsfiddle

var start = new Date(0); // pivote point of date.
var years = dDiff.getFullYear() - start.getFullYear();
var months = dDiff.getMonth() -  start.getMonth();
var days = dDiff.getDate() -  start.getDate();
var hours = dDiff.getHours() - start.getHours();;
console.log(years, months, days, hours);​

但是你必须根据那些值来操纵这些值(它们可能会变为负值)。

答案 2 :(得分:0)

Date表示特定时间点,而不是两个日期之间的时间跨度。 您正在通过设置自unix时代以来已经过去dDiff毫秒来创建新日期。

一旦你有几毫秒的时间,你应该通过划分它来提取所需的信息。 See this question

我是否可以建议您查看Moment.js

答案 3 :(得分:0)

这不准确,因为它没有考虑到闰日。除此之外,它工作正常,我没有看到任何问题。时差约为6.5天。考虑到时区以及0是1月1日的事实,我看到的值是预期的。

准确的解决方案是

  • 将时差转换为天数
  • 减去自指定日期起经过的闰年数
  • 将剩余的除以365以获得天数
  • 创建一个包含每个月日期计数的数组(不考虑闰日)并循环显示已过去的月份,减去已完成月份的日期计数。迭代次数将是您的月数
  • 剩余部分是您的日计数

答案 4 :(得分:0)

各种说明:

  • new Date(2012, 8, 28, 13, 14, 0, 0);是2012年9月28日13:14:00(如果你愿意的话,不是八月)
  • 由于使用夏令时的做法,
  • new Date(0)返回的值不是常量。
  • dDiff.getMonth(); 1月份返回0,2月份返回1等。
  • 日期的开始(1970年1月1日)以1开头,所以差异你应该减去它。

我认为第二点是你的错误。

根据您的算法,试试这个:

// create date in UTC
//create custom test date
var dlocaltime = new Date(2012, 8, 28, 13, 14, 0, 0);
var d1 = new Date(dlocaltime.getUTCFullYear(),dlocaltime.getUTCMonth(), dlocaltime.getUTCDate(), dlocaltime.getUTCHours(),dlocaltime.getUTCMinutes(),dlocaltime.getUTCSeconds());
//create current date
var now = new Date();
var d2 = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
console.log(d1);
console.log(d2);
//get date times (ms)
var d1Time = (d1.getTime());
var d2Time = (d2.getTime());


//calculate the difference in date times
var diff = d2 - d1;
//create a new date using the time differences (starts at Jan 1, 1970)
var dDiff = new Date();
dDiff.setTime(diff);
//chop off 1970 and get year, month, day, and hour
var years = dDiff.getUTCFullYear() - 1970;
var months = dDiff.getUTCMonth();
var days = dDiff.getUTCDate()-1; // the date of new Date(0) begin with 1 
var hours = dDiff.getUTCHours();
var minutes = dDiff.getUTCMinutes();
var seconds = dDiff.getUTCSeconds();
console.log("Years:"+years);
console.log("months:"+months);
console.log("days:"+days);
console.log("hours:"+hours);
console.log("minutes:"+minutes);
console.log("seconds:"+seconds);