我正在尝试按日期筛选内容。我有两个DateTimePicker,叫做FromDate和ToDate。我有一个数组,其中一个数组(str[10](中有一个日期,我尝试将字符串转换为日期时间格式,但仍然收到错误:
System.FormatException: 'String was not recognized as a valid DateTime.'
str[10]:中的字符串
str[10] = "9/22/2017 18:24";
我当前的代码:
string[] date = str[10].Split(' ');
DateTime dateSpec = DateTime.ParseExact(date[0], "MM/dd/yyyy", CultureInfo.CurrentCulture);
if (dateSpec >= FromDate.Value && dateSpec <= ToDate.Value)
{
//Do Something
}
我不太确定该怎么办,因为大多数论坛或多或少都建议做同样的事情。我不确定错误在哪里。我检查了数组,字符串也没有任何空格,认为这可能是错误的原因
"MM/dd/yyyy"
中的MM
表示月份组件将填充一个0
(如有必要(,使其长度为两位数。您的输入"9/22/2017"
仅使用个位数的月份,因此与该格式不匹配。如果将格式更改为"M/dd/yyyy"
,则解析成功。
此外,您不需要自己截断时间部分;如果时间格式是一致的(HH
:
mm
(,那么只需解析它并使用Date
属性来获得当天午夜的DateTime
。。。
DateTime dateSpec = DateTime.ParseExact(str[10], "M/dd/yyyy HH:mm", CultureInfo.CurrentCulture);
if (dateSpec.Date >= FromDate.Value && dateSpec.Date <= ToDate.Value)
{
//Do Something
}
根据str
的填充方式(例如用户输入(,还可以考虑使用DateTime.TryParseExact()
,它在失败时返回false
,而不是抛出FormatException
。。。
if (DateTime.TryParseExact(str[10], "M/dd/yyyy HH:mm", CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime dateSpec))
{
// Handle parsing success
if (dateSpec.Date >= FromDate.Value && dateSpec.Date <= ToDate.Value)
{
//Do Something
}
}
else
{
// Handle parsing failure
}
dateSpec
在传递时被声明为out
参数,这在C#7.0之后是可能的。
我在另一个平台上添加了另一个编码器建议的这段代码,从而使其正常工作
string[] formats = { "M/d/yyyy HH:mm", "M/dd/yyyy HH:mm", "MM/d/yyyy HH:mm", "MM/dd/yyyy HH:mm" };
DateTime dateSpec = DateTime.Now;
if (DateTime.TryParseExact(str[10].ToString(), formats, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out dateSpec))
{
if (dateSpec.Date >= FromDate.Value.Date && dateSpec.Date <= ToDate.Value.Date)
{
//Do Something
}
}
else
{
MessageBox.Show("Error");
}