Разбор нестандартных строк даты в C#
Как бы вы обработали следующее строковое значение, которое необходимо преобразовать в объект DateTime?
"2015/01/22 12:08:51 (GMT+09:00)"
Хотел бы включить это как распознанный шаблон DateTime. Поскольку я сталкиваюсь с другими форматами, я хотел бы просто реализовать новый шаблон.
4 ответа
Здесь фрагмент кода, который успешно проанализирует данную строку (уведомление DateTimeOffset
скорее, чем DateTime
):
var str = "2015/01/22 12:08:51 (GMT+09:00)";
var dt = DateTimeOffset.ParseExact
(str,
"yyyy/MM/dd HH:mm:ss (\\G\\M\\TK)",
System.Globalization.CultureInfo.InvariantCulture
);
//dt now has +9:00 offset - that's correct only if GMT is provided as UTC.
Больше информации в Разнице между GMT и UTC
Этот код берет строку и преобразует ее в объект DateTime
DateTime myDate = DateTime.Parse("2017-08-28 14:20:52,001", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
Все, что вам нужно сделать, это создать формат, который соответствует вашему вводу. Эта ссылка помогает: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
Для получения дополнительной информации читайте это: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/how-to-convert-a-string-to-a-datetime
Здесь есть официальная документация DateTime.Parse с некоторыми примерами. Он также охватывает другие форматы https://msdn.microsoft.com/it-it/library/system.datetime.parse(v=vs.110).aspx
С помощью DateTime.ParseExact
это, вероятно, ваш лучший выбор. Он принимает входную строку и ожидаемую строку формата, которой должны соответствовать входные данные. Он вернется true
если преобразование было успешным, и out
Параметр будет результатом преобразования (result
в приведенном ниже примере).
Мне не удалось заставить его работать без принудительного удаления части "GMT", но если это приемлемо для вас, приведенный ниже код должен работать.
Этот пример берет исходный ввод и преобразует его в время UTC (т.е. он настраивает время на основе вашего GMT
значение, которое должно вычесть 9 часов в вашем примере):
var input = "2015/01/22 12:08:51 (GMT-08:00)";
var format = "yyyy/MM/dd H:mm:ss (zzz)";
DateTime result;
// Remove the "GMT" portion of the input
input = input.Replace("GMT", "");
if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal, out result))
{
Console.WriteLine($"'{input}' converts to {result} UTC time.");
}
else
{
Console.WriteLine($"'{input}' is not in the correct format.");
}
Этот пример изменен по сравнению с теми, что указаны в документации DateTime.TryParseExact.