为什么 datetime 无法识别字符串?

Why datetime can't recognise the string?

在此代码中 item.date_time 看起来像“2017-10-18T04:57:39.000Z”。当我把这个(或任何其他类似的字符串)而不是 item.date_time - 它运作良好。但是尽管 item.date_time 等于这样的字符串 - 当我使用它时它会调用 System.FormatException。

static void Main(string[] args)
{
    eventList = new List<CsvFile>();
    StreamReader sr = new StreamReader("logs.csv");
    string data = sr.ReadLine();

    while (data != null)
    {
        string[] line = data.Split(',');
        ReadString(line);
        data = sr.ReadLine();
    }
} 

class CsvFile
{
    public String date_time;
    public DateTime datetime;
}

static void ReadString(String[] str)
    {
        CsvFile item = new CsvFile();
        item.date_time = str[0];
        item.datetime = DateTime.ParseExact(item.date_time, "yyyy-MM-ddTHH:mm:ss.000Z", CultureInfo.InvariantCulture);
        eventList.Add(item);
    }

今天翻了几十个datetime问题的问答,发现没有什么能解决这个奇怪的事情。知道我的代码有什么问题吗?

str[0] is equal "\"2017-10-18T04:57:39.000Z\""

您的字符串周围有引号(因此 \" 指示符)。 Trim 解析前:

    item.date_time = str[0].Trim('"');
    item.datetime = DateTime.ParseExact(item.date_time, "yyyy-MM-ddTHH:mm:ss.000Z", CultureInfo.InvariantCulture);

您可以考虑使用 TryParseExact,这样您就可以确定解析是否成功并显示更好的错误消息(例如您在哪条记录上,输入值是什么等)而不是抛出一个例外。

另一种选择是使用 CSV 解析库,它可以为您处理值周围的引号和 date/time 解析。