月末计算

时间:2009-06-11 02:00:10

标签: c# .net datetime date logic

只是想知道是否知道以下的优雅解决方案。

如果我有2009年6月30日而且我增加了一个月,我希望它到2009年7月31日,而不是2009年7月30日。

这个逻辑是基于这样一个事实,即2009年6月30日是6月底,当我加上一个月时,我想要到下个月月底。

但是,如果我在2009年6月29日和我增加一个月,它应该到2009年7月29日。

注意我需要能够添加任意数月,我需要考虑闰年。

此外,我知道这里的逻辑是值得怀疑的,但这是一项业务要求,适用于月底合约到月底的未来一个月。

我想过几个解决方案,但没有一个非常优雅。因此我觉得有人可能有更好的方法。

干杯 安东尼

10 个答案:

答案 0 :(得分:34)

要检查日期是否是月末,请检查第二天是否是某个月的第一天。你的算法应该是“如果这一天不是月末,加1个月。如果是月末,加一天,加一个月,减去一天。”

    bool IsEndOfMonth(DateTime date) {
        return date.AddDays(1).Day == 1;
    }
    DateTime AddMonthSpecial(DateTime date) {
        if (IsEndOfMonth(date))
            return date.AddDays(1).AddMonths(1).AddDays(-1);
        else
            return date.AddMonths(1);
    }

答案 1 :(得分:2)

DateTime exampleDate = DateTime.Parse("12/31/2009");
bool isLastDayOfMonth = (exampleDate.AddDays(1).Month != exampleDate.Month);

if (isLastDayOfMonth)
    Console.WriteLine(exampleDate.AddDays(1).AddMonths(1).AddDays(-1));
else
    Console.WriteLine(new DateTime(exampleDate.Year, exampleDate.Month, 1).AddMonths(2).AddDays(-1));
编辑:我再次阅读你的问题。您需要检查是否是该月的最后一天。

对不起,我希望我已经清楚地看到了所需要的问题 希望这足以让你知道需要什么。

答案 2 :(得分:1)

你可以从上个月的第一天开始到一天回去吗?

答案 3 :(得分:0)

  1. 测试旧日期是否为“月末”。
    1. 在日期中添加一天,查看月份编号是否发生变化。
  2. 添加一个月
  3. 如果旧日期是“月末”
    1. 将月份日期设置为1
    2. 再添加一个月
    3. 减去一天

答案 4 :(得分:0)

我解决这个问题的方法是从一个例行程序开始,确定某一天是否是该月的最后一天(考虑到闰年当然是Februaries!)

你还需要一个例行程序,在一个月的最后一天,给出你那个月的一天。

然后,如果您遇到的是最后一天,添加一天,并使用第二个例程来获取该月的最后一天。使用循环多个月。

答案 5 :(得分:0)

您可以实现EndOfMonth()和isEndOfMonth()。

所以你的代码或多或少会是

if isEndOfMonth( this.Date() )
  endDate = (startmonth + addedMonths).EndOfMonth()
else
  endDate = startDate + addedMonths

有点简单,但你明白了。

对于EndOFMonth和isEndOfMonth的逻辑,当然有很多想法

答案 6 :(得分:0)

这是一个简单的.NET C#解决方案,它适用于闰年等:

static DateTime ContractDue(DateTime start, int months)
{
     if (start.Month == start.AddDays(1).Month)
     { // Same month, just add the months
            return start.AddMonths(months);
     }
     // Last day of month... add a day, add the months, then go back one day
     return start.AddDays(1).AddMonths(months).AddDays(-1);
}

答案 7 :(得分:0)

您可以使用DateTime.DaysInMonth()方法,如下所示:

DateTime workingMonth = new DateTime(2009, 06, 30).AddDays(1);
int nextMonthDays = DateTime.DaysInMonth(workingMonth.Year, workingMonth.Month);
DateTime newMonth = new DateTime(workingMonth.Year, workingMonth.Month, nextMonthDays);

答案 8 :(得分:0)

那么这是否可以作为补充函数来查找我是否在一个月的开始? DateTime.Now.AddDays(-1).Month == DateTime.Now.AddMonths(-1).Month

答案 9 :(得分:-1)

如果您只需要EndOfMonth或简单的AddNMonth,那么您已经得到了答案。

否则,要获得完整的通用解决方案,您需要实现重复模式,因为您可以在Outlook Meeting interface的UI中看到它。我不是建议您使用Outlook实现,但是应该有一些.NET组件可以购买。或者自己实现它,但不要低估它并对其进行单元测试 - 这是一个非常棘手的实现组件。