每月结算周期的最佳模式

时间:2011-03-22 16:28:57

标签: c# datetime billing

我为我的新结算系统编写了一些代码。目的是在每个月的同一天向客户收费。 (不是当月的第一天或最后一天)

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;
    } 

两个陷阱是:

  1. 如果他的cycleDate.Day是31,而当前月只有29天
  2. cycleDate是2012年2月29日 - 他只会按闰年计费
  3. 这里有一个共同的最佳做法吗?

    所以看起来有很多事要检查

    1. 这个帐号已经在本月结算了吗?
    2. 当月的周期日是否存在
    3. 是大于或等于当前日期的周期日(这是理想的,如果 交易在前一天失败了)
    4. 谢谢!

4 个答案:

答案 0 :(得分:6)

只允许在 1 - 28 之间选择结算日。根据我的经验,这是大多数信用卡/贷款公司在给出选择时如何处理它。

答案 1 :(得分:2)

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

如果我是客户,我希望每月16日收费。没问题。如果我想在每个月的31日收费,那么显而易见的问题不是所有月份都有31天,正如你在问题中指出的那样。

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

还有更多问题吗?

答案 2 :(得分:0)

我会说让他在1-28或任何一天之间做出选择,但如果当前月份的天数少于所选择的某一天,那么该月份的最后一天会收取费用。

答案 3 :(得分:0)

好的,我相信我完全过度 - 思考这个问题。 这很简单,涵盖了一切:

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

它不一定会在同一天收费,但它足够接近。 如果交易被拒绝了一天,或者如果计划任务在下次运行时没有运行1天,这也会增加灵活性,这将会提取它。