Разбор нестандартных строк даты в 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.

Другие вопросы по тегам