1

我试图寻找答案,但我找不到任何答案。我正在尝试创建一个 JavaScript 函数,它需要两个日期并以“x 年、y 月、z 天、a 小时、b 分钟、c 秒”的格式返回一个字符串。通常的迭代除法失败,因为月份可以有不同的天数。我找到了几个来源,但它们要么只持续几天/小时/分钟而忽略了月份的问题,要么只是错误地平均每月的天数。

function dateDifference(date) {
    now = new Date();
    ??;
    return difference; //returns something like "x years, y months, z days, a hours, b minutes, c seconds"
}

谢谢您的帮助

4

3 回答 3

2

使用 moment.js 这是一个非常好的功能,您可以以纯文本形式返回时间。

http://momentjs.com/

阅读 API 文档,对函数进行一些巧妙的修改,您可以获得所需的输出字符串格式。顺便说一句,没有特定的库可以以我知道的所需格式输出日期。所以,如果你在某个地方需要 moment.js 的帮助,请告诉我

于 2013-05-16T21:10:00.573 回答
2

使用 .getTime 将日期转换为毫秒:

var date1 = new Date(),
    date2 = new Date(someDate),
    diff = Math.abs(date1.getTime() - date2.getTime());

// then convert into years, months, etc

编辑:你不能摆脱平均几个月的长度,因为问题通常是模棱两可的。例如,如果计算 2 月 3 日和 3 月 10 日之间的差异是 1 个月 7 天(假设 2 月是 28 天)或 1 个月 4 天(假设 3 月是 31 天)?

EDIT2:纠正了我真正令人震惊的数学。

EDIT3:实际上,考虑到这一点,任何正常人都会将第一个月的日期转换为最后一个月,并使用它来计算天数的差异。所以:

var date1 = new Date(),
    date2 = new Date(1981, 10, 18);
    switch = (date2.getTime() - date1.getTime()) < 0 ? false : true, // work out which is the later date
    laterDate = switch ? date2 : date1;
    earlierDate = switch ? date1 : date2;
    dayDiff = laterDate.getDate() - earlierDate.getDate(),
    monthDiff = laterDate.getMonth() - earlierDate.getMonth(), // javascript uses zero-indexed months (0-11 rather than the more conventional 1-12)
    yearDiff = laterDate.getFullYear() - earlierDate.getFullYear(),
    months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 

if (dayDiff < 0) {
    monthDiff--;
    dayDiff += months[laterDate.getMonth()-1]; // -1 because we want the previous month
}

if (monthDiff < 0) {
    yearDiff--;
    monthDiff += 12;
}

console.log(yearDiff+' years, '+monthDiff+' months, '+dayDiff+' days');

我认为这让我们大部分时间都在那里,但我们仍然必须考虑闰年

编辑4:纠正了几个(有时但不幸的是,并不总是取消)1个错误

于 2013-05-16T21:28:23.177 回答
0

您只需减去两个日期即可获得毫秒,然后从那里开始工作:

var date1 = new Date("2012/06/12 12:00:30");
var date2 = new Date("2013/06/15 12:00:40");
var diff = Math.abs(date2 - date1);
var years = Math.floor(diff/(1000*60*60*24*365)); // 1
var months = Math.floor((diff - years) / (1000*60*60*24*30)) % 12; // 0
(...)
于 2013-05-16T21:27:30.233 回答