Подтвердить что ты не робот

Синхронизация DateTime

Я пишу syslog-сервер, который получает сообщения syslog и сохраняет их в базе данных.

Я пытаюсь проанализировать строку даты, полученную в сообщении, в структуру 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-го числа).

Каков правильный способ разобрать эту строку?

4b9b3361

Ответ 1

Рассмотрим эту строку:

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

Обратите внимание, что я удалил одно из промежутков между месяцем и днем. Это потому, что AllowWhiteSpaces буквально означает:

Указывает, что s может содержать начальные, внутренние и конечные пробелы, не определенные форматом.

Ответ 2

Используйте DateTime.ParseExact перегрузку, которая принимает массив строк формата:

DateTime.ParseExact(Log.Date, 
                    new [] {"MMM  d HH:mm:ss", "MMM d HH:mm:ss"}, 
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None);

Ответ 3

Сначала вы можете удалить дополнительное пространство, а затем проанализировать строку:

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

Ответ 4

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.

Ответ 5

    DateTime.ParseExact(date, "MMM d HH:mm:ss", CultureInfo.InvariantCulture,DateTimeStyles.AllowInnerWhite)