将闰年的日期转换为DateTime

问题描述:

我正在尝试编写自己的日历。 但现在我在闰年遇到一些问题。 我无法解析2月29日datetime。每次我想运行我的代码时,出现错误“字符串未被识别为有效的日期时间”将闰年的日期转换为DateTime

我只会得到错误,如果我想解析2月29日,其他日期工作正常。

这里只是我的代码的一小部分发生错误:

string day = date.Text; 
string year = DateTime.Now.Year.ToString(); 
string month = tbMonat.Text; 
string stringDate = day + "." + month + "." + year; 
DateTime dt = Convert.ToDateTime(stringDate); 

有谁知道,为什么我得到这个错误,而我怎么能解决这个问题?

编辑:

下面是代码,我如何计算,如果它是一个闰年。

case "Februar": 
      int aktuellesjahr = Int32.Parse(cbJahr.Text); 
      if((aktuellesjahr % 4 == 0 && aktuellesjahr % 100 != 0) || aktuellesjahr % 400 == 0) 
      { 
       days = 29; 
      } 
      else 
      { 
       days = 28; 
      } 
      break; 
+1

你确定你正在试图解析日期的年份是闰年? – Pikoh

+1

'string year = DateTime.Now.Year.ToString();' - 但是... 2017并不是闰年... –

+0

您确定它是闰年的代码,可以解决2016年的飞跃年,但不是2017 :) – john

你有内置函数DateTime.IsLeapYear,你可以在这里使用。 尝试是这样的:

string day = date.Text; 
string year = DateTime.Now.Year.ToString(); 
string month = tbMonat.Text; 

if (!DateTime.IsLeapYear(year()) && day == 29 && month == 2) 
{ 
    MessageBox.Show("this is not leap year, please enter correct date"): 
} 
else 
{ 
    string stringDate = day + "." + month + "." + year; 
    DateTime dt = Convert.ToDateTime(stringDate); 
    //better to use like this, but you need to convert strings to ints 
    //DateTime dt = new DateTime(year, month, day); 
    //rest of your code... 
} 

编辑:因为你的代码很容易出现许多异常(如果有什么用户输入32天,或“A”或......),这将是最好有将其转换为日期时间之前检查数据的一些方法。事情是这样的:

private bool IsValidDate(string day, string month, string year) 
{ 
    int i; 
    //check if all those values for date/month/year can be converted to number 
    if (!int.TryParse(day, out i) || !int.TryParse(day, out i) || !int.TryParse(day, out i)) 
     return false; 

    //now check if date, written in format dd.MM.yyyy can be converted to DateTime. 
    DateTime dt; 
    string stringDate = day.PadLeft(2, '0') + "." + month.PadLeft(2, '0') + "." + year; 
    return DateTime.TryParseExact(stringDate, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt); 

} 

用法是这样的:

+0

看看我的编辑。我解决了DateTime.IsLeapYear函数。因为我听说该功能有一些缺点。 – CallMeLeonardo

+1

IsLeapYear年份'%4 == 0 &&(year%100!= 0 || year%400 == 0)'。因此,您自己的代码几乎完全是您想要的。 – Ralf

+0

@Ralf哦,好的。很高兴知道。我在某处听到有关“它使用不同类型的日历”的信息。但在这种情况下,我听到了一些胡言乱语。 – CallMeLeonardo

你并不需要检查闰年。 只需使用:

DateTime.DaysInMonth(year, month); // return number days of a month. 

然后

if(days > DateTime.DaysInMonth(year, month)) 
    days = DateTime.DaysInMonth(year, month) // or show an error message 
+0

我真的很喜欢你使用的方法。虽然我发现了这个问题,但我会包含您的解决方案。 – CallMeLeonardo