我正在尝试将字符串解析为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
。
答案 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作为返回值。不要尝试自定义解决方法。