从Datetime解析额外的字符

时间:2013-03-07 07:16:43

标签: c# .net regex

您好我有以下代码从文件中读取日期。

using (var reader = new StreamReader(@"C:\myfile.txt")) 
{
    bool found= false;
    while (!reader.EndOfStream) 
  {
        var line = reader.ReadLine().Trim();

        if (found && line.EndsWith("Test")) 
        {
            var fordDate = DateTime.Parse(line.Substring(0, 19));
            Console.WriteLine("Test Date: {0}", fordDate);
            break;
        }
   }
 }

问题是,当日期与其他文本连接时,它会出错。 例如

\r\n2013-03-03 12:22:02 

我正在尝试更改它,以便代码可以从中删除“\ r \ n”或任何其他文本,只是获取日期部分。

3 个答案:

答案 0 :(得分:3)

您应该使用正则表达式

如果您的日期始终采用相同的格式,您可以轻松编写一个正则表达式,从单个行中提取日期并删除每一行的其他内容。为了理解正则表达式,应该如下所示:

\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}

此正则表达式过于简化,并允许0000-00-00 99:99:99之类的日期可能无效。这取决于您的文件是否可以包含某些可能与日期相关的值,但不是。一个更复杂(但更有效)的表达式是(假设日期为YYYY-MM-DD而不是YYYY-DD-MM):

[12]\d{3}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)

这一年将允许1000至2999年的日期,正确的月份编号为01-12,日期为01-31,小时为00:00:00至23:59:59。

但为了使这个正则表达式更有用,我会将它放在括号中并给它起一个名称,这样这些日期就会成为代码中命名的捕获组(date)的一部分,你可以使用它来访问它们名字而不是索引。

Regex rx = "(?<date>[12]\d{3}-(?:0\d|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)).*Test$";
if (rx.Text(line))
{
    Match m = rx.Match(line);
    // no need to use TryParse as regex assures correct formatting
    fordDate = DateTime.Parse(m.Groups["date"]);
}

因此,我没有手动检查该行以Test结尾,而是在正则表达式中包含了相同的要求。

答案 1 :(得分:1)

使用此代码替换您需要的符号:

string lineAfterReplace = line.Replace("\t", "").Replace("\r", "").Replace("\n", "");

@J。戴维森 - 使用TryParse MSDN Link

也可能更好

比你有某种代码:

if (DateTime.TryParse(dateString, out dateValue))
{
   /* it was parsed without errors */
}

答案 2 :(得分:0)

更改:

var fordDate = DateTime.Parse(line.Substring(0, 19));

要:

var fordDate = DateTime.Parse(line.Substring(0, 19).Trim());

如果每个DateTime字符串在文件的一行中是唯一的,则最好使用:

var fordDate = DateTime.Parse(line.Trim());