【问题标题】:JS time calculation - How many times a date has occurred between two datesJS时间计算-两个日期之间一个日期发生了多少次
【发布时间】:2014-06-24 14:57:51
【问题描述】:

我真的需要一些 JS 时间计算方面的帮助。

基本上我需要计算两个日期之间一个月的一天发生了多少次。

例如 -

2014 年 2 月 1 日至 2014 年 5 月 14 日之间的每月 15 日的日期为 3 2014 年 2 月 1 日至 2014 年 5 月 16 日之间每月 15 日的日期为 4

我查看了 moment Jquery 库,但它估计一个月是 30 天,所以我不会准确并考虑闰年 - 28 天等月份。

它确实需要准确,因为它用于计费事件计算。日期可以保留很多年,因此可能会因为 30 天的事情而导致不准确。

任何帮助将不胜感激

【问题讨论】:

  • 如果允许使用moment.js,可以使用isaaccambron.com/twix.js。这将完全满足您的需求,而无需处理晚上 11:59:59 的问题等或您可能需要考虑的 TZ 问题。
  • 感谢 amchang87 - 我现在正在尝试使用 twix,但似乎没有一个功能可以满足我的需求 - 在这种情况下,你 htink 会使用什么功能?

标签: javascript jquery date


【解决方案1】:

可能有一百万种方法可以做到这一点......这是一种蛮力的方法:

// add a "addDays() method to Date"
Date.prototype.addDays = function(days)
{
    var dat = new Date(this.valueOf());
    dat.setDate(dat.getDate() + days);
    return dat;
}

// provide two dates and a day ordinal you want to count between the two
function numOrdinalsBetweenDts(Date1, Date2, theOrdinal) {
    var temp;

    if(Date2 < Date1) {  // put dates in the right order (lesser first)
        temp = Date1;
        Date1 = Date2;
        Date2 = temp;
    }

    var workDate = Date1;
    var ctr = 0;
    while(workDate < Date2) {    // iterate through the calendar until we're past the end
        if(workDate.getDate() == theOrdinal)   // if we match the ordinal, count it
            ctr++;
        workDate = workDate.addDays(1);   // move the calendar forward a day
    }
    return ctr;
}


var result = numOrdinalsBetweenDts(new Date("July 21, 1901"), new Date("July 21, 2014"), 2);
console.log(result);
alert(result);

【讨论】:

  • 稍微调整了一下,但效果惊人!非常感谢!
【解决方案2】:

在 Javascript Date 构造函数中有一个稍微违反直觉的行为,如果您创建一个新的 Date 并将日期设置为 0,它将假定该月的最后一天。您可以使用以下函数获取一个月中的天数:

function daysInMonth(month, year) {
    return new Date(year, month, 0).getDate();
}

Javascript 日期对象可识别闰年,因此您可以可靠地使用此功能。

然后,您只需计算开始日期和结束日期之间的月数,并检查每个月以确保该月中实际存在天数。如果一天小于或等于 28,您可以将此检查短路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2012-06-28
    • 2011-01-16
    • 2013-03-30
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多