30

我正在编写一个系统日志服务器,它接收系统日志消息并将它们存储在数据库中。

我正在尝试将消息中收到的日期字符串解析为DateTime结构。

对于以下示例,为了清楚起见,我将使用下划线代替空格;收到的实际字符串有空格。

我收到的字符串格式为"Jun__7_08:09:10"- 请注意月份和日期之间的两个空格。

如果日期在 10 日之后,则字符串变为"Jun_10_08:09:10"(一个空格)。

如果我解析:

DateTime.ParseExact(Log.Date, "MMM  d HH:mm:ss", CultureInfo.InvariantCulture);

它适用于从第 1 到第 9 的字符串,但从第 10 号向前抛出异常,如果我用一个空格解析,它会在第 1 到第 9 天抛出异常(并从第 10 号开始工作)。

解析这个字符串的正确方法是什么?

4

5 回答 5

49

考虑使用这一行:

DateTime.ParseExact(Log.Date,
    "MMM d HH:mm:ss",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AllowWhiteSpaces);

请注意,我删除了月份和日期之间的空格之一。那是因为AllowWhiteSpaces字面意思是:

指定 s 可以包含格式未定义的前导、内部和尾随空格。

于 2013-06-07T13:10:09.917 回答
23

使用DateTime.ParseExact采用格式字符串数组的重载:

DateTime.ParseExact(Log.Date, 
                    new [] {"MMM  d HH:mm:ss", "MMM d HH:mm:ss"}, 
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None);
于 2013-06-07T13:09:03.943 回答
3

您可以先删除多余的空间,然后解析字符串:

DateTime.ParseExact(Log.Date.Replace("  ", " "), "MMM d HH:mm:ss", CultureInfo.InvariantCulture);
于 2013-06-07T13:11:05.293 回答
1

DateTime 的ParseExect方法有一些重载,您可以在其中传递多种格式,如果较早的格式不起作用,则可以读取这些格式。这里给你一个样本..

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                         "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                         "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                         "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                         "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
      string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
                              "5/1/2009 6:32:00", "05/01/2009 06:32", 
                              "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; 
      DateTime dateValue;

      foreach (string dateString in dateStrings)
      {
         try {
            dateValue = DateTime.ParseExact(dateString, formats, 
                                            new CultureInfo("en-US"), 
                                            DateTimeStyles.None);
            Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
         }
         catch (FormatException) {
            Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
         }                                               
      }
   }
}
// The example displays the following output:
//       Converted '5/1/2009 6:32 PM' to 5/1/2009 6:32:00 PM.
//       Converted '05/01/2009 6:32:05 PM' to 5/1/2009 6:32:05 PM.
//       Converted '5/1/2009 6:32:00' to 5/1/2009 6:32:00 AM.
//       Converted '05/01/2009 06:32' to 5/1/2009 6:32:00 AM.
//       Converted '05/01/2009 06:32:00 PM' to 5/1/2009 6:32:00 PM.
//       Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
于 2013-06-07T13:16:33.863 回答
1
    DateTime.ParseExact(date, "MMM d HH:mm:ss", CultureInfo.InvariantCulture,DateTimeStyles.AllowInnerWhite)
于 2013-06-07T13:16:48.200 回答