C#中的日期计算

时间:2011-01-21 15:50:05

标签: c# datetime

当给出开始日期时,需要对其进行各种计算以产生3个其他日期。

基本上我需要根据当前日期确定用户根据不同频率收费的日期。

双年度(每年收费两次), 每季度(每年收费4次), 和两个月(其他月份开帐单)。

截止日期为26/04/2008
- BiAnnually:此日期最后一次收费标准为26/10/2010,并且日期为26/04/2011。
- 季度:此日期最后一次收费将于2011年1月26日结算,并应至今日为26/04/2011 - 两个月:此日期将在2010年12月26日之前结算,并且应该提供日期为26/02/2011。

非常感谢协助。

4 个答案:

答案 0 :(得分:3)

我认为你可以这样做:

public void FindNextDate(DateTime startDate, int interval);
  DateTime today = DateTime.Today;
  do {
    startDate = startDate.AddMonths(interval);
  } while (startDate <= today);
  return startDate;
}

用法:

DateTime startDate = new DateTime(2008, m4, 26);

DateTime bi = FindNextDate(startDate, 6);
DateTime quarterly = FindNextDate(startDate, 3);
DateTime two = FindNextDate(startDate, 2);

答案 1 :(得分:0)

我认为你想要的就像是

DateTime x = YourDateBasis;
y = x.AddMonths(6);
y = x.AddMonths(3);
y = x.AddMonths(2);

然后从评论中进行编辑,

日期数学每个人的帐户的周期周期,您只需要开始和结束日期,并继续添加相应的月份,直到您创建所有预期的月份。几乎与每月应付3年的贷款一样

DateTime CurrentDate = DateTime.Now;
while( CurrentDate < YourFinalDateInFuture )
{
   CurrentDate = CurrentDate.AddMonths( CycleFrequency );
   Add Record into your table as needed
   Perform other calcs as needed
}

答案 2 :(得分:0)

enum BillPeriod
{
   TwoMonth = 2,
   Quarterly = 3,
   SemiAnnually = 6,
   BiAnnually = 24
}

public Pair<Datetime, Datetime> BillDates(Datetime currentBillDate, BillPeriod period)
{
   Datetime LastBill = currentBillDate.AddMonths(-1 * (int)period);
   Datetime NextBill = currentBillDate.AddMonths((int)period);
   return new Pair<Datetime,Datetime>(LastBill, NextBill);
}

答案 3 :(得分:0)

这是一个糟糕的解决方案,但它确实有效。请记住,红灯,绿灯,重构。在这里,我们处于绿灯状态:

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine(GetLastBilled(new DateTime(2008, 4, 26), 6));
            Console.WriteLine(GetNextBilled(new DateTime(2008, 4, 26), 6));

            Console.WriteLine(GetLastBilled(new DateTime(2008, 4, 26), 4));
            Console.WriteLine(GetNextBilled(new DateTime(2008, 4, 26), 4));

            Console.WriteLine(GetLastBilled(new DateTime(2008, 4, 26), 2));
            Console.WriteLine(GetNextBilled(new DateTime(2008, 4, 26), 2));

            Console.WriteLine("Complete...");
            Console.ReadKey(true);
        }

        static DateTime GetLastBilled(DateTime initialDate, int billingInterval) {
            // strip time and handle staggered month-end and 2/29
            var result = initialDate.Date.AddYears(DateTime.Now.Year - initialDate.Year);
            while (result > DateTime.Now.Date) {
                result = result.AddMonths(billingInterval * -1);
            }
            return result;
        }

        static DateTime GetNextBilled(DateTime initialDate, int billingInterval) {
            // strip time and handle staggered month-end and 2/29
            var result = initialDate.Date.AddYears(DateTime.Now.Year - initialDate.Year);
            while (result > DateTime.Now.Date) {
                result = result.AddMonths(billingInterval * -1);
            }
            result = result.AddMonths(billingInterval);
            return result;
        }
    }
}

这真的很棘手。例如,您需要考虑到您的帐单日期可能是闰年的2/29,而不是所有月份都有相同的天数。这就是我做initialDate.Date.AddYears(DateTime.Now.Year - initialDate.Year);电话的原因。