只是想知道是否知道以下的优雅解决方案。
如果我有2009年6月30日而且我增加了一个月,我希望它到2009年7月31日,而不是2009年7月30日。
这个逻辑是基于这样一个事实,即2009年6月30日是6月底,当我加上一个月时,我想要到下个月月底。
但是,如果我在2009年6月29日和我增加一个月,它应该到2009年7月29日。
注意我需要能够添加任意数月,我需要考虑闰年。
此外,我知道这里的逻辑是值得怀疑的,但这是一项业务要求,适用于月底合约到月底的未来一个月。
我想过几个解决方案,但没有一个非常优雅。因此我觉得有人可能有更好的方法。
干杯 安东尼
答案 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)
答案 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组件可以购买。或者自己实现它,但不要低估它并对其进行单元测试 - 这是一个非常棘手的实现组件。