2017-10-19 85 views
-1

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

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

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

+3

显然有一个值不符合您预期的日期时间格式模式。使用调试器来确定它是什么。也许有一个空行或者你有空格或编码是不同的或有一个隐藏的字符....唯一可以弄清楚的是你,你有权访问它失败的值,而我们不(*因为你没有在你的问题中包含它们) – Igor

+0

你绝对确定这些字符串是相同的吗? 'item.date_time'是否有引号或转义字符?将它们打印到控制台。 – Blorgbeard

+2

或者使用'DateTime.TryParseExact',并且如果它返回false,则将*只是*值打印到控制台。 –

回答

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解析库,它可以处理有关值的引号和解析日期/时间。

+0

非常感谢你,@D史丹利,这对我来说非常完美。 我在编码方面是绝对新手,当然我知道这不是一个聪明的问题。无论如何,我很感谢所有人,尤其是你。 –

+0

@twin_choke不要害怕问 - 每个人都从某个地方开始。 –

相关问题