Синхронизация 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-го числа).
Каков правильный способ разобрать эту строку?
Ответы
Ответ 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)