C# 如何确定两个日期之间的分期付款数量?

C# 如何确定两个日期之间的分期付款数量?,c#,C#,假设银行客户在每月的最后一天支付RD分期付款 public static bool IsLastDayOfMonth(DateTime date) { return date.AddDays(1).Month != date.Month; } 因此,在2013年10月12日和2013年12月10日之间必须有两次分期付款 我如何知道客户在这段时间内支付了多少分期付款 我应该使用吗 嗯。以下是我的努力: public sealed class DateDifference { in

假设银行客户在每月的最后一天支付RD分期付款

public static bool IsLastDayOfMonth(DateTime date)
{
    return date.AddDays(1).Month != date.Month;
}
因此,在2013年10月12日和2013年12月10日之间必须有两次分期付款

我如何知道客户在这段时间内支付了多少分期付款

我应该使用吗

嗯。以下是我的努力:

public sealed class DateDifference
{
    int years;

    public int Years
    {
        get { return years; }
    }
    int months;

    public int Months
    {
        get { return months; }
    }
    int days;

    public int Days
    {
        get { return days; }
    }

    public override string ToString()
    {
        return string.Format("[DateDifference Years={0}, Months={1}, Days={2}]", years, months, days);
    }


    public DateDifference(DateTime earlier, DateTime later)
    {
        if (later < earlier)
            throw new ArgumentException("later is earlier than 'earlier'.");
        bool isleapday = (earlier.Month == 2 && earlier.Day == 29);
        DateTime tmp = isleapday ? new DateTime(earlier.Year, 2, 28) : earlier;
        while (true)
        {
            try
            {
                tmp = tmp.AddYears(1);
                if (isleapday && DateTime.IsLeapYear(tmp.Year))
                    tmp = new DateTime(tmp.Year, 2, 29);
            }
            catch (ArgumentOutOfRangeException)
            {
                break;
            }
            if (tmp <= later)
            {
                years++;
                earlier = tmp;
            }
            else
            {
                break;
            }
        }
        // Add months
        tmp = earlier;
        while (true)
        {
            try
            {
                tmp = tmp.AddMonths(1);
                if (isleapday && tmp.Day != 29 && tmp.Month != 2)
                    tmp = new DateTime(tmp.Year, tmp.Month, 29);
            }
            catch (ArgumentOutOfRangeException)
            {
                break;
            }
            if (tmp <= later)
            {
                months++;
                earlier = tmp;
            }
            else
            {
                break;
            }
        }
        tmp = earlier;
        while (true)
        {
            try
            {
                tmp = tmp.AddDays(1);
            }
            catch (ArgumentOutOfRangeException)
            {
                break;
            }
            if (tmp <= later)
            {
                days++;
                earlier = tmp;
            }
            else
            {
                break;
            }
        }
    }

DateDifference dateDifference = new DateDifference(startDateTextBox.Value, endDateTextBox.Value);

            this.noOfInstallmentsTextBox.Text =  ((int)++dateDifference.Months).ToString();
公共密封类日期差异
{
整数年;
公共整数年
{
获取{返回年份;}
}
整数个月;
公众整数月份
{
获取{返回月份;}
}
国际日;
公众整数日
{
获取{返回天数;}
}
公共重写字符串ToString()
{
返回string.Format(“[DateDifference Years={0},Months={1},Days={2}]”,Years,Months,Days);
}
公共日期差(DateTime较早,DateTime较晚)
{
如果(以后<以前)
抛出新ArgumentException(“晚于”早于“早”);
bool isleapday=(previous.Month==2和previous.Day==29);
DateTime tmp=isleapday?新日期时间(更早。年,2,28):更早;
while(true)
{
尝试
{
tmp=tmp.增加年数(1);
if(isleapday&&DateTime.IsLeapYear(tmp.Year))
tmp=新日期时间(tmp.Year,2,29);
}
捕获(ArgumentOutOfRangeException)
{
打破
}

如果(tmp我希望它能帮助你

int foo(DateTime start, DateTime end)
{
    int count = end.Month - start.Month;
    if (count < 0)
        count += 12;
    count += 12 * (end.Year - start.Year);
    return count;
}
intfoo(日期时间开始,日期时间结束)
{
int count=end.Month-start.Month;
如果(计数<0)
计数+=12;
计数+=12*(年末-年初);
返回计数;
}

因此,我首先要说的是,我没有在这里优先考虑速度。日期时间问题很棘手。编写能够确保在世界各地的各种情况下都能工作的方法是很困难的。这种方法设计为在所有边缘情况下都能工作,并且让读者清楚这一点。它并不试图对cleaver进行优化因为在奇数边缘的情况下,离子往往不起作用,这在datetime世界中太常见了,无法忽略

因此,首先,我们将从一个简单的助手方法开始,以获取两个日期之间的所有日期:

public static IEnumerable<DateTime> Days(DateTime start, DateTime end)
{
    DateTime current = start;
    while (current < end)
    {
        yield return current;
        current = current.AddDays(1);
    }
}
实际上,我们可以将一个月的最后一天定义为其月份与下一天月份不同的唯一日期

现在,当我们将这些结合在一起时,我们有一个对读者来说非常简单和清晰的实现:

public static int InstallmentCount(DateTime start, DateTime end)
{
    return Days(start, end)
        .Where(day => IsLastDayOfMonth(day))
        .Count();
}

您可能应该先付出一些努力。让客户支付分期付款,将其限制在这两个日期之间的分期付款,并获得
Count
属性。@BROY:首先请告诉我们您做了什么。这样我们可以方便地帮您。需要特别检查
end
是否是一个月的最后一天(如果OP希望包含,则为+1)如果
start
end
没有设置为相同的时区或相同的日历,该怎么办?丹尼尔,我不确定在测量日期时,是否能捕捉到月份最后一天的细微差别。如果开始日期是2013年1月1日,结束日期是2013年2月1日,我建议Reed Copsey,该代码将提供两次分期付款就在这一天之后提交:)是的,我没有考虑时区。一个月的最后一天是一个类比。这个例行程序必须适用于一个月的任何一天。@BROY那么你所需要做的就是更改“IsLastDayOfMonth”无论你有什么逻辑来确定这是否是讨论中的给定日期。如果你想知道这是一个月的第一天,请将
date.day
与1、15或你感兴趣的任何其他日期进行比较。