C#计算日期

时间:2012-12-12 13:43:33

标签: c# date date-arithmetic

我正在寻找一些帮助来计算新调度系统的截止日期。

目前,时间表基于每月或每周付款,从定义的日期开始。

在新的时间表中,我们希望这是基于客户支付频率,从定义的日期开始。

我们有13种支付频率选项:

  1. Montly - 上一个工作日
  2. 每月 - 相同日期,例如20日,25日
  3. 每月 - 周一/周二/周三/周四/周五
  4. 每月 - 周二/周二/周三/周四/周五
  5. 每月 - 周三/周二/周三/周四/周五
  6. 每月 - 上周一/周二/周三/周四/周五
  7. 每周 - 周一
  8. 每周 - 周二
  9. 每周 - 周三
  10. 每周 - 周四
  11. 每周 - 周五
  12. 每周4次
  13. 每两周
  14. 根据传入的付款频率以及付款和余额,我需要制定新的时间表。

    第一笔付款是直接进行的,因为它是在通过日期,计划中的其他日期需要从该日期开始计算(取决于付款频率)。

    我还需要确保预定的日期是在工作日(周一至周五)并且不会在公共/银行假日降落 - 在这种情况下,我将恢复到下一个有效的工作日。

    我到目前为止的方法如下 - 我需要帮助的区域评论:

      

    //计算下一个付款日期

    public IList<ScheduledInstalment> GenerateSchedule(int agreementID, int paymentCount, 
        PayFrequency frequency, double balance, DateTime firstPaymentDate)
    {
        IList<ScheduledInstalment> schedule = new List<ScheduledInstalment>();
    
        PaymentCalculation calc = GetPaymentCalculation(frequency, firstPaymentDate);
    
        double regularInstalment = Math.Round(balance / paymentCount, 1);
        double finalInstalment = Math.Round(((regularInstalment * (paymentCount - 1)) - balance), 2);
    
        for (int i = 0; i <= paymentCount; i++)
        {
            ScheduledInstalment s = new ScheduledInstalment();
    
            s.AgreementID = agreementID;
    
            if (i == 0)
            {
                // First Payment
                s.DueDate = firstPaymentDate;
                s.AmountDue = regularInstalment;
            }
            else 
    
                // Calculate next payment date
    
                if (i < paymentCount)
                {
                    // Regular Payment
                    s.AmountDue = regularInstalment;
                }
                else
                {
                    // Final Payment
                    s.AmountDue = finalInstalment;
                }
    
            schedule.Add(s);
        }
    
        return schedule;
    }
    

1 个答案:

答案 0 :(得分:1)

好的,我已经设法获得了似乎有用的东西,这是我的方法:

public DateTime GetNextRepaymentDate(DateTime BaseDate, int instalmentCount, PaymentCalculation calc)
            {
                DateTime dueDate = new DateTime();

                switch (calc.Interval)
                {
                    case DateInterval.Month:

                        dueDate = BaseDate.AddMonths((instalmentCount) * calc.Number);

                        if (!string.IsNullOrEmpty(calc.OtherCriteria))
                        {
                            if (calc.OtherCriteria == "Last")
                            {
                                int lastDay = DateTime.DaysInMonth(dueDate.Year, dueDate.Month);
                                dueDate = Convert.ToDateTime(string.Format("{0}/{1}/{2}", lastDay, dueDate.Month, dueDate.Year));
                            }
                            else
                            {
                                int fixedDate = Convert.ToInt32(calc.OtherCriteria);

                                if (dueDate.Day != fixedDate)
                                {
                                    if (dueDate.Day > fixedDate)
                                    {
                                        while (dueDate.Day != fixedDate)
                                        {
                                            dueDate = dueDate.AddDays(-1);
                                        }
                                    }
                                    else
                                    {
                                        while (dueDate.Day != fixedDate)
                                        {
                                            dueDate = dueDate.AddDays(1);
                                        }
                                    }
                                }
                            }
                        }

                        break;

                    case DateInterval.WeekOfYear:

                        dueDate = BaseDate.AddDays((instalmentCount) * (calc.Number * 7));

                        if (calc.FixedDay != null)
                        {
                            while (dueDate.DayOfWeek != calc.FixedDay)
                            {
                                dueDate = dueDate.AddDays(-1);
                            }
                        }

                        break;
                }

                while (!PaymentIsAllowedOnDate(dueDate) == true)
                {
                    dueDate = dueDate.AddDays(-1);
                }

                return dueDate;
            }