我试图寻找答案,但我找不到任何答案。 我正在尝试创建一个JavaScript函数,它接受两个日期并返回格式为“x years,y months,z days,a hours,b minutes,c seconds”的字符串。 通常的迭代划分失败,因为月份可以有不同的天数。我找到了几个来源,但它们要么只能达到几天/几小时/分钟而忽略了几个月的问题,要么就是错误地平均每月的几天。
function dateDifference(date) {
now = new Date();
??;
return difference; //returns something like "x years, y months, z days, a hours, b minutes, c seconds"
}
感谢您的帮助
答案 0 :(得分:2)
使用moment.js这是一个非常好的功能,你可以用纯文本形式返回时间。
阅读API文档,通过对该函数的一些巧妙的黑客攻击,您可以获得所需的输出字符串格式。顺便说一句,没有特定的库可以输出我所知道的所需格式的日期。所以,如果你到了某个地方并且需要帮助,请告诉我们.js
答案 1 :(得分: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天(假设一个月是28天,如2月)或1个月和4天(假设一个月是31天,如3月)?
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错误
答案 2 :(得分: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
(...)