1

我正在尝试使用 javascript 确定两个日期之间经过的时间。例如:“我在 2008 年 1 月 5 日凌晨 3 点戒烟,我戒烟已经过去了多少年、几个月和几小时?”。

所以我的想法是:

  1. 获取“退出”日期
  2. 获取当前日期
  3. 转换为时间(毫秒)
  4. 找出差异
  5. 使用差异创建新日期
  6. 从该日期提取年、月等

好吧,它表现得很奇怪,我无法指出原因。有什么见解吗?

//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();

您可以在这个临时主机上看到它的运行情况。

4

5 回答 5

0

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

准确的解决方案是

  • 将时差转换为天
  • 减去自指定日期以来经过的闰年数
  • 剩下的除以 365 得到天数
  • 创建一个包含每个月的天数的数组(不考虑闰日)并循环遍历经过的月份,减去已完成月份的天数。迭代次数将是您的月数
  • 剩下的就是你的天数
于 2012-10-04T19:26:03.313 回答
0

你为什么不只是做数学来计算值?你在 Date 中输入的dDiff.setTime(diff);内容对你来说毫无意义。这只是给你diff从纪元开始的日期毫秒。

于 2012-10-04T19:12:37.640 回答
0

各种注释:

  • new Date(2012, 8, 28, 13, 14, 0, 0);是 2012 年 9 月 28 日 13:14:00(如果你愿意,不是 8 月)
  • 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);
于 2012-10-04T19:33:37.677 回答
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);​

但是你必须根据那里的价值来操纵这些价值(它们可能是负面的)。

于 2012-10-04T19:17:32.860 回答
0

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

一旦经过了几毫秒,就应该通过除法来提取所需的信息。看到这个问题

我可以推荐看看Moment.js吗?

于 2012-10-04T19:17:38.970 回答