7

我为我的新计费系统编写了一些代码。目的是在每个月的同一天向客户开具账单。(不是每月的第一天或最后一天)

static bool NeedToBill(DateTime planLastBilled, DateTime cycleDate)
    {
        // is today the same date as the cycleDate AND is was the planLastBilled not the same day as today?
        if (DateTime.UtcNow.Day.Equals(cycleDate.Day) && !DateTime.UtcNow.Day.Equals(planLastBilled))
            return true;
        else
            return false;
    } 

2个陷阱是:

  1. 如果他的 cycleDate.Day 是 31 而当月只有 29 天
  2. cycleDate 是 2012 年 2 月 29 日 - 他只会在闰年计费

这里有一个共同的最佳实践吗?

所以似乎有很多事情要检查

  1. 这个帐户本月是否已计费?
  2. 循环日是否存在于当月
  3. 是大于或等于当前日期的周期日(如果交易在前一天失败,这是理想的)

谢谢!

4

4 回答 4

8

只允许在1 - 28之间选择计费日。以我的经验,这是大多数信用卡/贷款公司在做出选择时的处理方式。

于 2011-03-22T16:30:36.093 回答
2

每个月的同一天是什么意思?

如果我是客户,我希望在每个月的 16 号收到账单。没问题。如果我想在每个月的 31 日计费,那么明显的问题并不是所有月份都有 31 天,正如您在问题中指出的那样。

为什么不检查当前月份的天数。如果少于 31 天,则将当月的最后一天作为账单日期。

还有更多的问题吗?

于 2011-03-22T16:37:08.420 回答
0

我会说让他在 1-28 之间进行选择,或者任何一天,但如果当前月份的天数少于所选的月份天数,则在该月的最后一天收费。

于 2011-03-22T16:44:44.027 回答
0

好吧,我相信我已经完全过度思考了。这很简单,涵盖了所有内容:

bool NeedToBill = ((DateTime.UTCNow – LastBillDate) >= 30 Days)

它不一定会在同一天开具账单,但它已经足够接近了。如果事务被拒绝一天,或者如果计划的任务在下一次运行时没有运行 1 天,这也会增加灵活性。

于 2011-03-22T18:09:56.383 回答