У меня есть объект С# DateTime, и мне нужно увеличить его на один месяц.
Пример:
input output
-------------------------------
Jan 12, 2005 Feb 12, 2005
Feb 28, 2009 Mar 28, 2009
Dec 31, 2009 Jan 31, 2010
Jan 29, 2000 Feb 29, 2000
Jan 29, 2100 Error: no Feb 29, 2100
Каков наилучший способ сделать это.
Моя первая мысль (кроме некоторого встроенного кода) заключалась в том, чтобы построить новую DateTime из кусков и обработать рулон до года.
Здесь представлена полная программа, показывающая примеры, приведенные в вопросе. Вероятно, вы захотите использовать исключение в OneMonthAfter, если это действительно не следует так называть.
using System;
using System.Net;
public class Test
{
static void Main(string[] args)
{
Check(new DateTime(2005, 1, 12));
Check(new DateTime(2009, 2, 28));
Check(new DateTime(2009, 12, 31));
Check(new DateTime(2000, 1, 29));
Check(new DateTime(2100, 1, 29));
}
static void Check(DateTime date)
{
DateTime? next = OneMonthAfter(date);
Console.WriteLine("{0} {1}", date,
next == null ? (object) "Error" : next);
}
static DateTime? OneMonthAfter(DateTime date)
{
DateTime ret = date.AddMonths(1);
if (ret.Day != date.Day)
{
// Or throw an exception
return null;
}
return ret;
}
}
Это работает для меня:
DateTime d = DateTime.Now;
d.AddMonths(1);
using System;
public static class Test
{
public static void Main()
{
string[] dates = { "Jan 12, 2005", "Feb 28, 2009", "Dec 31, 2009", "Jan 29, 2000", "Jan 29, 2100" };
foreach (string date in dates)
{
DateTime t1 = DateTime.Parse(date);
DateTime t2 = t1.AddMonths(1);
if (t1.Day != t2.Day)
Console.WriteLine("Error: no " + t2.ToString("MMM") + " " + t1.Day + ", " + t2.Year);
else
Console.WriteLine(t2.ToString("MMM dd, yyyy"));
}
Console.ReadLine();
}
}