为什么datetime不能识别字符串?
在此代码中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);
}
我今天经历了几十个有关日期时间问题的问题和答案,但发现什么都不能解决这个奇怪的事情。任何想法我的代码有什么问题?
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解析库,它可以处理有关值的引号和解析日期/时间。
非常感谢你,@D史丹利,这对我来说非常完美。 我在编码方面是绝对新手,当然我知道这不是一个聪明的问题。无论如何,我很感谢所有人,尤其是你。 –
@twin_choke不要害怕问 - 每个人都从某个地方开始。 –
显然有一个值不符合您预期的日期时间格式模式。使用调试器来确定它是什么。也许有一个空行或者你有空格或编码是不同的或有一个隐藏的字符....唯一可以弄清楚的是你,你有权访问它失败的值,而我们不(*因为你没有在你的问题中包含它们) – Igor
你绝对确定这些字符串是相同的吗? 'item.date_time'是否有引号或转义字符?将它们打印到控制台。 – Blorgbeard
或者使用'DateTime.TryParseExact',并且如果它返回false,则将*只是*值打印到控制台。 –