DateTime.TryParseExact不会解析看似有效的日期字符串

时间:2018-01-24 17:11:03

标签: c# datetime

这将是其中之一"我无法相信我没有想到这个"问题,但它让我两天都感到烦恼。

我有一堆日期字符串(以及更多数据列)来自.csv文件,格式为:8/8/2017 8:57

我已阅读了SO herehere以及来自herehere的MSDN上的文档。

以下是我在LINQPad中使用C#语句尝试的一些内容,改编自MSDN examples

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:正如大多数人所指出的,我使用整个字符串而不是日期值,尽管我仍然使用单个字符串收到错误。以下是Joel建议修改的第一个if()

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);
}

我已成功将其中的一个版本合并到我的生产代码中,并按预期工作。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

仔细查看您的数据:

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()方法是看着你认为它的字符串。