【问题标题】:Best pattern for a monthly billing cycle每月计费周期的最佳模式
【发布时间】:2011-07-20 15:42:42
【问题描述】:

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

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 日 - 他只会在闰年计费

这里有通用的最佳实践吗?

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

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

谢谢!

【问题讨论】:

    标签: c# datetime billing


    【解决方案1】:

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

    【讨论】:

    • 虽然这行得通,但支持 29 日、30 日和 31 日并不是什么大问题。
    • 是的 - 但它为每个参与的人简化了它。 OP 要求在每个月的同一天结算,所以这是唯一可能的答案。
    【解决方案2】:

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

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

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

    还有更多的问题吗?

    【讨论】:

      【解决方案3】:

      我会说让他在 1 到 28 之间进行选择,或者如果当月的天数少于所选的当月日期,则在该月的最后一天收费。

      【讨论】:

      • 他们没有选择周期日期 = 帐户创建日期
      • 那么同样的事情,如果当月的天数少于他们创建帐户的日期,则将其设为创建帐户的日期或当月的最后一天
      【解决方案4】:

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

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

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

      【讨论】:

      • 你确定这行得通吗?在我看来,您每年会将计费日期更改约 5 天,最终向您的客户多收费用(每 6 年额外收取 1 笔账单)。如果您的公司有足够的订阅者,这听起来像是集体诉讼的好案例……
      • DateTime.AddMonths 考虑闰年和不同的 EOM 日期。
      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多