用JavaScript计算时间跨度(以年、月和天为单位)
Calculating timespan in years, months and days in JavaScript
我想计算两个日期之间的时间跨度(注意:输入格式为dd.MM.yyyy,请参阅下面的代码)。特别的是,他们不想每个月用30天,一年用360天。我更希望在"人的形式"上有所不同(不知道如何称呼它)。
比方说,我想计算从2014年10月1日到2015年3月17日的差额(包括最后一天)。从10月到2月,这将是5个月。然后休息18天(从第1天到第17天,包括第17天)。所以结果应该是:
0年5个月18天
这种计算当然忽略了一些月份有31、30、28或29天(除了日期计算,日期的形式是:开始日期:2014年10月17日;结束日期:2015年1月12日)。
不幸的是,我没有找到任何已经实现这种计算的JS库。Moments.js似乎没有任何方法。
所以我开始创建自己的代码,但离预期结果还有几天(2-3天)。老实说,如果我看我的代码,我会觉得它很糟糕,必须有一种更智能、更优雅的方法来计算它(在我的例子中,我将它输出到一个跨度):
function getTimeDifferenceContract(startDateStr, endDateStr) {
var returnObject = { "years": null, "months": null, "days": null };
var startDateArray = startDateStr.split('.');
var endDateArray = endDateStr.split('.');
var startMonthIx = startDateArray[1]-1;
var endMonthIx = endDateArray[1]-1;
var startDate = new Date(startDateArray[2], startMonthIx, startDateArray[0]);
var endDate = new Date(endDateArray[2], endMonthIx, endDateArray[0]);
var endDateFixed = new Date(endDate.getTime()+(1*24*60*60*1000));
if (endDate > startDate) {
var years = 0;
var months = 0;
var days = 0;
var dateDiff = endDateFixed.getTime() - startDate.getTime();
var sD = startDate.getDate();
var sM = startDate.getMonth()+1;
var sY = startDate.getFullYear();
var eD = endDateFixed.getDate();
var eM = endDateFixed.getMonth()+1;
var eY = endDateFixed.getFullYear();
if (sY == eY && sM == eM) {
days = Math.floor(dateDiff / (1000 * 60 * 60 * 24));
}
else if (sY == eY) {
if (sD > eD) {
months = eM - sM - 1;
var startMonthRestDays = getMonthdays(sM, sY) - sD;
days = startMonthRestDays + eD;
}
else {
months = eM - sM;
days = eD - sD;
}
}
else {
years = eY - sY - 1;
var monthForYears = 0;
if (years > 0) {
monthForYears = (years - 1) * 12;
} else {
monthForYears = years * 12;
}
months = (12 - sM) + (eM - 1) + (monthForYears)
var startMonthRestDays = getMonthdays(sM, sY) - sD;
days = startMonthRestDays + eD - 0;
}
var lastMonth = eM - 1;
var yearForEndMonthDays = eY;
if (lastMonth < 1) {
lastMonth = 12;
yearForEndMonthDays = eY - 1;
}
var endMonthDays = getMonthdays(lastMonth, yearForEndMonthDays);
if (days >= endMonthDays) {
months = months + 1;
days = days - endMonthDays - 1;
}
if (months >= 12) {
years = years + 1;
months = months - 12;
}
returnObject.years = years;
returnObject.months = months;
returnObject.days = days;
}
return returnObject;
}
function main() {
var difference = getTimeDifferenceContract("30.09.2014", "01.10.2015");
var years = difference.years;
var months = difference.months;
var days = difference.days;
jQuery('#myText').text(years + " years, " + months + " months, " + days + " days");
}
main();
Fiddle:http://jsfiddle.net/4ddL27gx/2/
有什么解决办法吗?
我希望这将有所帮助:
在JavaScript 中获取两个日期(年、月、日)之间的差异
我也有同样的必要性,但没有答案,所以我写了一个似乎有效的函数。。。
我已经利用这一时刻来实现您需要的结果
var moment1 = new moment(new Date("30/Sep/2014"));
var moment2 = new moment(new Date("01/Oct/2015"));
var diffInMilliSeconds = moment2.diff(moment1);
var duration = moment.duration(diffInMilliSeconds);
var years = duration.years();
var months = duration.months();
var days = duration.days();
$('.div1').text(moment1.format());
$('.div2').text(moment2.format());
$('.div3').text(years + " years, " + months + " months, " + days + " days");
jsfiddlehttp://jsfiddle.net/mfarouk/qLqm3uuh/1/
相关文章:
- 如果宽度是百分比,如何设置以px为单位的图像高度
- 如何将datetime转换为以毫秒为单位的epoch时间javascript
- 每小时倒计时一次,但以30分钟为单位
- 以天为单位计算年龄-Javascript
- 是否可以使用javascript获取以em为单位的窗口宽度
- 获取以屏幕像素为单位的旋转SVG元素的边界
- GridStack项的高度和宽度(以像素为单位)
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- JQPlot's仪表-以针为单位显示值
- Moment.js unix时间戳,以分钟为单位显示以前的时间
- 从Javascript到C#获取正确的日期(以毫秒为单位)
- 远距离变换元素的宽度/高度(以像素为单位)
- jquery匹配以px为单位的样式字体大小的元素
- 打印 3 年日历,以当月开始的月份为单位
- 将以毫秒为单位的日期转换为日/月/年
- 如何将 UNIX 时间转换为表示以年日等为单位的时间量的数组
- 如何在Microsoft CRM 2011中根据出生日期计算年龄(以年和月为单位)
- 用JavaScript计算时间跨度(以年、月和天为单位)
- 查找以年为单位的两个日期之间的差异
- 以年为单位向日期添加天数