如何通过JavaScript计算两个日期之间的月份和日期?
我们使用下面的代码。如何通过JavaScript计算两个日期之间的月份和日期?
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var firstDate = new Date(2008,01,12);
var secondDate = new Date(2008,01,22);
var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay));
但我们无法在它们之间找到月份和日期。 我想假设开始日期是2014年9月27日,结束日期是2014年1月1日。结果将是1个月和5天。
有多种方法来计算月和日。没有进一步限制,即使结果可能不同,所有纠正都是正确的。
例如从9月27日至11月一日可以是任一
- 1个月和5天或
- 4天,1个月。
这是一种可能的解决方案。
// swap dates if difference would be negative
if (firstDate.getTime() > secondDate.getTime()) {
var tmp = firstDate;
firstDate = secondDate;
secondDate = tmp;
}
var years = secondDate.getFullYear() - firstDate.getFullYear();
var months = secondDate.getMonth() - firstDate.getMonth();
var days = secondDate.getDate() - firstDate.getDate();
// prevent negative amount of days by breaking up months
for (var i = 0; days < 0; ++i) {
// while the day difference is negative
// we break up months into days, starting with the first
months -= 1;
days += new Date(
firstDate.getFullYear(),
firstDate.getMonth() + 1 + i,
0, 0, 0, 0, 0
).getDate();
}
// prevent negative amount of months by breaking up years
if (months < 0) {
years += Math.floor(months/12);
months = (months % 12 + 12) % 12;
}
// print the result
console.log([
{amount: days, unit: 'day'},
{amount: months, unit: 'month'},
{amount: years, unit: 'year'},
].filter(value => value.amount).map(value =>
value.amount === 1 ?
`${value.amount} ${value.unit}` :
`${value.amount} ${value.unit}s`
).reduce((result, part, index, parts) =>
index > 0 ? index === parts.length - 1 ?
`${result} and ${part}` :
`${result}, ${part}` :
`${part}`,
`0 days`
));
实例:
- 02/12至02/22:10天
- 09/27 11/01到:1天1个月//而不是1个月和5天
- 12/31 03/01到:每日1 2个月//而不是1个月和29天
- 5月31日至06/30:30天
- 1月31日至03/30:30天和1个月//而不是1个月和27个月天
- 10/27/2010至2014年8月26日:30天9个月至3年
使用2013-12-31和2014-03-01给2个月和-2天。 – RobG 2014-09-27 11:59:27
@RobG谢谢你的提示。将两个日期的距离分解为几天和几个月是有点模糊的。显然,我的第一种方法(首先计算几个月,然后几天)有一些特别的情况,尽管我认为大多数人会以这种方式手动进行。我已经更改了代码,现在它首先计算几天,然后几个月。这应该解决所有问题,但仍然没有错误。 – Robert 2014-09-27 12:29:33
有很多“特例”,这并不容易。现在2014-05-31至2014-06-30给30天,应该是1个月吗?通常也有行政规则,例如在某些司法管辖区,2月29日出生的人在2月28日的非闰年生日,但在其他司法辖区则是3月1日。是6月30日+1月30日或7月31日?增加和减去年份和月份也不一定是对称的。一切都很好玩。 ;-) – RobG 2014-09-27 12:36:09
试试这个
var oneDay = 24*60*60*1000;
var firstDate = new Date(2007,01,12);
var secondDate = new Date(2008,01,22);
var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime()));
var result = '',
years, months, days;
if((years = diffDays/(365 * oneDay)) > 1){
result += Math.floor(years) + ' Year(s)';
diffDays %= (365 * oneDay);
}
if((months = diffDays/(30 * oneDay)) > 1){
result += Math.floor(months) + ' Month(s)';
diffDays %= (30 * oneDay);
}
result += (diffDays/oneDay) + ' Days(s)';
alert(result);
http://stackoverflow.com/questions/7763327/how-to-calculate-date-difference -in-javascript应该做你所需要的大概 – Rhumborl 2014-09-27 10:26:02
我希望你知道01月是二月。 – Robert 2014-09-27 11:17:25
是的。我有两个月的问题。 – krutssss 2014-09-29 06:44:23