【问题标题】:Parsing extra characters from Datetime从日期时间解析额外的字符
【发布时间】:2013-03-07 07:16:42
【问题描述】:

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

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" 或任何其他文本,并仅获取日期部分。

【问题讨论】:

  • 你试过修剪子串line.Substring(0, 19).Trim()
  • 你的代码有效吗?找到的值永远不会改变,无法解析日期时间。
  • @Kane 如果字符串以可修剪字符开头,则子字符串的长度将不再足以容纳相关数据。
  • 请看我的回答 - 我们与 Robert Koritnik 进行了讨论 :) 你的回答真的是指“任何可能的文本”吗?
  • @x2。不,它没有。在此处查看完整代码:stackoverflow.com/questions/15239902/…

标签: c# .net regex


【解决方案1】:

你应该使用正则表达式

如果您的日期始终采用相同的格式,您可以轻松编写一个正则表达式,从各个行中提取日期并去除每一侧的任何其他内容。为了理解正则表达式应该是这样的:

\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 结尾的行,而是在正则表达式中包含了相同的要求。

【讨论】:

  • @OscarMederos:没关系,但这是一个不同(尽管相关)问题的不同问题。在我们在这里回答的这个问题中,我们几乎没有去除任何其他垃圾的日期。
  • 见我回答的最后一行。我只是指出我已经建议他使用那个正则表达式。没什么大不了的,只是一个评论;)
【解决方案2】:

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

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

@J。戴维森 - 使用 TryParse MSDN Link 可能对你来说更好

比你有一些这样的代码:

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

【讨论】:

  • @RobertKoritnik - 在 J. Davidson 问题“当日期有其他文本时..”它不等于“任何”。我的回答符合问题中的例子。
  • 您应该阅读他的最后一行:...以便代码可以从中删除“\r\n”或任何 其他文本...
  • 我认为他的意思是某种字符串格式,这就是为什么 \r 和 \t
  • 我真的不在乎 any 是指任何\s 字符还是任何其他字符。我不想假设 OP 的问题。我宁愿写一个答案来处理他写的 any 。没有假设。
  • 是的,它可以是任何文本,这只是其中之一 \r\n
【解决方案3】:

变化:

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

收件人:

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

如果每个日期时间字符串都单独在文件的一行中,则最好使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多