DateTime.TryParseExact不会分析看起来有效的日期字符串
这将是其中一个“我不相信我没有想到这个”的问题,但是让我两天的时间感到困扰。
我从这种格式的.csv文件中获得了一堆日期字符串(以及更多列数据): 8/8/2017 8:57
我已阅读这里和这里的SO问题以及MSDN上的文档。
以下是我在LINQPad的C#语句中尝试过的一些事情,可以从MSDN示例中进行修改:
string[] data = { "8/8/2017 8:57,-1.220135,-1.239456,-3.20E-08,-4.47E-09,-1.202865"};
Console.WriteLine(data);
string dateValue = "8/8/2017 8:57";
string[] patterns = {"M/d/yyyy H:mm", "MM/dd/yyyy H:mm"};
DateTime parsedDate;
if (DateTime.TryParseExact(data[0].ToString(), patterns,
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None,
out parsedDate))
{
Console.WriteLine("Converted '{0}' to {1}.",
dateValue,
parsedDate);
}
else
{
Console.WriteLine("Unable to convert '{0}' to a date and time.",
dateValue);
}
if (DateTime.TryParseExact(data[0].ToString(),
patterns,
null,
System.Globalization.DateTimeStyles.None,
out parsedDate))
{
Console.WriteLine("Converted '{0}' to {1}.",
dateValue,
parsedDate);
}
else
{
Console.WriteLine("Unable to convert '{0}' to a date and time.",
dateValue);
}
两者都导致:
Unable to convert '8/8/2017 8:57' to a date and time.
Unable to convert '8/8/2017 8:57' to a date and time.
我试过string[] patterns...
声明中的几个变体无济于事。
我错过了什么? 我怀疑问题在于我的模式数组,但也许不是? 这似乎应该很容易。
我没有结婚到DateTime.TryParseExact()
,只要我从转换中获得有效的DateTime。
编辑:在一些评论后,我检查了我的CultureInfo.CurrentCulture
,它是en-US
,应该没问题,或者至少我是这么认为的。
Edit1:正如大多数人所指出的那样,我使用的是整个字符串而不是日期值,尽管我仍然使用单个字符串得到错误。 这是第一个if()
修改,如下面的Joel所建议的那样:
string[] data = "8/8/2017 8:57,-1.220135,-1.239456,-3.20E-08,-4.47E-09,".Split(',');
string dateValue = "8/8/2017 8:57";
string[] patterns = {"M/d/yyyy H:mm"};
DateTime parsedDate;
if (DateTime.TryParseExact(data[0], patterns,
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None,
out parsedDate))
{
Console.WriteLine("Converted '{0}' to {1}.",
dateValue,
parsedDate);
}
else
{
Console.WriteLine("Unable to convert '{0}' to a date and time.",
dateValue);
}
我已经设法将这个版本合并到我的生产代码中,并按预期工作。 谢谢您的帮助。
仔细看看你的数据:
string[] data = { "8/8/2017 8:57,-1.220135,-1.239456,-3.20E-08,-4.47E-09,-1.202865"};
该数组只有一个元素,其中该元素的值是所有文本。 它在控制台消息中看起来不同,因为您将8/8/2017 8:57
值放入单独的变量中,而不是使用数组。
你可能想要这个吗?
string[] data={"8/8/2017 8:57","-1.22013","-1.239456","-3.20E-08","-4.47E-09","-1.202865"};
或者你也许想要这样做:
var data = "8/8/2017 8:57,-1.220135,-1.239456,-3.20E-08,-4.47E-09,-1.202865".Split(',');
**注意我通常不会宽恕使用.Split()
作为csv解析器,但对于这个简单的示例,它可以获得重点。
无论你做什么,我都要确保你的控制台消息准确地反映你试图做的事情(使用data[0]
作为第一个替换),所以你可以确定TryParseExact()
方法正在查看你认为它的字符串。
上一篇: DateTime.TryParseExact won't parse what appears to be a valid date string