无法从字符串转换为日期时间C#

时间:2018-04-11 09:14:33

标签: c# parsing datetime

我正在尝试将字符串解析为Datetime,但它无效并发出错误:

  

" String未被识别为有效的DateTime。"

字符串很完美。

以下是代码:

string deliv = DeliveryDateTextBox.Text;

string[] delivday = deliv.Split('-');
int year, month, day;

int.TryParse(delivday[0], out day);
int.TryParse(delivday[1], out month);
int.TryParse(delivday[2], out year);

string dtt = day + "/" + month + "/" + year;

DateTime datet = DateTime.ParseExact(dtt, "dd/MM/yyyy", null);

jobcard.DeliveryDate = datet;

我调试了代码,它在{01-01-0001 12:00:00 AM}上提供了datet

3 个答案:

答案 0 :(得分:7)

除了你在原始字符串上使用new DateTime(year, month, day),甚至是DateTime.TryParseExact(deliv, "d-M-yyyy", .... )这一事实...

您对DateTime.ParseExact()的来电失败,因为您的输入字符串包含一位数 day 和/或一位数 month ,而您的模式dd/MM/yyyy要求两者都有两位数。

这可以通过对模式使用d/M/yyyy来修复,它将接受单个和两个数字。但请不要,请看第一段!

答案 1 :(得分:1)

你在这段代码中复杂的事情。 手动解析字符串以提取日,月和年的int值只是为了将它们重新组合成一个新字符串并解析它没有任何意义。

只需尝试解析原始字符串:

DateTime datet;
if(DateTime.TryParseExact(
   DeliveryDateTextBox.Text, 
   "dd-MM-yyyy", 
   CultureInfo.InvariantCulture, 
   DateTimeStyles.None, out datet))
{
    // string was successfully parsed to dateTime.
}

答案 2 :(得分:1)

没有“完美”的DateTime字符串。你怎么能/应该代表一个DateTime在Windows的CultureFormat上100%依赖,即使在语言中也可能完全不同:例如en-gb和en-us不同意小数,千分隔符和其中订购日期组件应列出。

你的整个代码没有多大意义。看起来你有一些脱节的文本框,用户单独输入日,月和年。然后你将它们解析为int。然后你把它们变成一个字符串。然后你尝试解析字符串。

如果原始用户输入有效,您甚至不会检查。对Int的原始解析可能已经失败。因此,您可能会尝试将0/0/0解析为DateTime。您的输出实际上是完美的答案。然后在1800年之前就有类似东西的东西,实际上并不是在格里高利历上。

如果您希望用户输入日期,请​​使用DatePicker元素。我所知道的每一种GUI技术都有一种。它们为您提供DateTimes作为返回值。不要尝试自定义解决方法。