假设银行 - 客户在每个月的最后一天支付RD分期付款。
因此,2013年10月12日至2013年12月10日期间必须分两期。
如何知道客户在这段时间内支付了多少分期付款?
我应该使用NodaTime library吗?
确定。这是我的努力:
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();
答案 0 :(得分: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;
}
答案 1 :(得分:1)
所以我首先要说的是我没有优先考虑速度。日期时间问题很棘手。您可以确定的编写方法适用于世界各地的各种角落案例 hard 。这种方法旨在尽管所有边缘情况都能工作,并且读者可以清楚地了解这种情况。它不会尝试进行切割器优化,因为它往往不适用于奇数边缘情况,这在日期时间世界中常常无法忽略。
首先,我们将从一个简单的帮助方法开始,以获取两个日期之间的所有日子:
public static IEnumerable<DateTime> Days(DateTime start, DateTime end)
{
DateTime current = start;
while (current < end)
{
yield return current;
current = current.AddDays(1);
}
}
(如果你想要更通用的东西,你可能会在start
之后得到下一个日期,如果你想让所有返回的值都是“午夜”。你也可以交换start
和{{1如果它们是相反的顺序,或抛出异常,等等。还要考虑你想要的确切语义;我有开头的包含和最后的独占,你可能想要它完全包容,完全独占等。 )
我们还将创建一种方法来确定日期是否是该月的最后一天。
end
我们实际上可以定义该月的最后一天作为其月份与第二天的月份不同的唯一日期。
现在,当我们将这些结合在一起时,我们有一个非常简单明了的实现:
public static bool IsLastDayOfMonth(DateTime date)
{
return date.AddDays(1).Month != date.Month;
}