当前位置: 首页 > 知识库问答 >
问题:

如何通过JavaScript计算两个日期之间的月份和天数?

壤驷心思
2023-03-14

我们使用下面的代码。

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年11月1日。结果将是1个月零5天。

共有2个答案

琴英华
2023-03-14

试试这个

js lang-js prettyprint-override">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);
酆耀
2023-03-14

有多种方法可以计算月份和日期。没有进一步的限制,即使结果可能不同,所有正确的方法都是正确的。

例如,从9月27日到11月1日可以是

  • 1个月零5天或

这是一个可能的解决方案。

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

例子:

  • 12月2日至22日:10天
  • 09/27至11/01:4天1个月//而不是1个月5天
  • 12月31日至01年3月:1天2个月//而不是1个月29天
  • 5月31日至6月30日:30天
  • 01/31至03/30:30天零1个月//而不是1个月零27天
  • 2010年10月27日至2014年8月26日:30天9个月零3年
 类似资料:
  • 问题内容: 我有两个约会: 开始日期: 结束日期: 在上述两个日期之间的91天持续时间,我希望我的代码返回3个月的持续时间,但以下方法仅返回2个月。有谁有更好的建议?还是你们认为这是Java 8中的错误?工期为91天,仅返回2个月。 非常感谢你的帮助。 方法1: 方法2: 方法3: 我尝试使用Joda库而不是Java 8 API,它可以工作。它会返回3,它看起来像Java持续时间月份的计算也使用了

  • 请注意,这不是以下任何一个的复制品 计算两个Java日期实例之间的差异 用java计算两个日期之间的月份[重复] 我有两个约会: 开始日期: 它的91天持续时间之间的上述两个日期,我期望我的代码返回3个月的持续时间,但下面的方法只返回2个月。有人有更好的建议吗?还是你们认为这是8Java的窃听器?91天的期限只返回2个月。 非常感谢你的帮助。 方法1: 方法二: 方法3: 我尝试使用Joda库而不

  • 问题内容: 我正在计算从“开始”到“结束”日期之间的天数。例如,如果起始日期为2010年4月13日,起始日期为2010年5月15日,则结果应为 如何使用JavaScript获得结果? 问题答案:

  • 问题内容: 我有两个输入日期来自Date Picker控件。我选择了开始日期2/2/2012和结束日期2/7/2012。我为此编写了以下代码。 我应该得到6的结果,但是我却得到5。 谁能告诉我如何获得确切的区别? 问题答案: 从Moment文档: 或包含起点: 避免手动打乱时间戳和时区。 根据您的特定用例,您可以 使用和/或强制diff在“端点”处包含或排除(如@kotpal在评论中所建议)。 设

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个

  • 问题内容: 我编写了以下代码来查找两个日期之间的日期 当开始日期和结束日期分别是2/3/2017和3/3/2017时,显示的天数是29.尽管它们是同一天,但显示的是1.(请假的天数。如果请假一天,他必须选择相同的开始日期和结束日期。因此,在这种情况下,他请了两天假。 我究竟做错了什么?感谢您的时间。 注意:请不要使用日期构造函数。检查下面接受的答案。使用simpledateformat或Joda时