-3

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

因此,在 2013 年 10 月 12 日和 2013 年 12 月 10 日之间必须有 2 期。

我怎样才能知道客户在此期间支付了多少分期付款?

我应该使用NodaTime 库吗?

好的。这是我的努力:

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();
4

2 回答 2

1

我希望它会帮助你。

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;
}
于 2013-11-01T17:54:47.340 回答
1

所以我首先要说我在这里没有优先考虑速度。日期时间问题很棘手。编写可以确定在全世界各种极端情况下都有效的方法是很困难的。这种方法旨在在所有边缘情况下都能正常工作,并且让读者清楚这一点。它不会尝试进行切割器优化,因为它在奇怪的边缘情况下往往不起作用,这在日期时间世界中太常见而无法忽略。

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

public static IEnumerable<DateTime> Days(DateTime start, DateTime end)
{
    DateTime current = start;
    while (current < end)
    {
        yield return current;
        current = current.AddDays(1);
    }
}

(如果你想要更通用的东西,你可能会在 之后得到下一个日期start,如果你希望所有返回的值都是“午夜”。你也可以交换它们startend如果它们是相反的顺序,或者抛出异常等。还有考虑您想要的确切语义;我在开始时包含边界,在结束时具有排他性,您可能希望它完全包含、完全排他等)

我们还将创建一个方法来确定某个日期是否是该月的最后一天。

public static bool IsLastDayOfMonth(DateTime date)
{
    return date.AddDays(1).Month != date.Month;
}

实际上,我们可以将一个月的最后一天定义为其月份与下一天的月份不同的唯一日期。

现在,当我们将这些组合在一起时,我们有一个对读者来说非常简单明了的实现:

public static int InstallmentCount(DateTime start, DateTime end)
{
    return Days(start, end)
        .Where(day => IsLastDayOfMonth(day))
        .Count();
}
于 2013-11-01T18:06:01.980 回答