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

时间:2017-10-19 20:39:58

标签: c# datetime iso8601

在此代码中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);
    }

我今天经历了关于日期时间问题的几十个问题和答案,但发现没有什么可以解决这个奇怪的事情。任何想法我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

  

str [0]等于"\"2017-10-18T04:57:39.000Z\""

你的字符串有引号(因此\"指标)。在解析之前修剪它们:

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

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

另一种方法是使用CSV解析库,它可以处理值周围的引号和解析日期/时间。