Точная дата разбора в C# с переменной длиной года
Я пытаюсь найти подходящую строку формата для анализа (точного) следующих типов дат:
1-01-01T00:00:00+00:00
- 1 января 0001 г.2011-12-14T15:53:40+00:00
- 14 декабря 2011 года
Таким образом, длина года кажется переменной (1-4 символа).
Формат, который я сейчас использую для точного разбора:c_DateTimeFormatString = "yyyy-MM-ddTHH':'mm':'sszzz"
Очевидно, это соответствует только второй строке. Первый всплыл сегодня. Теперь мы должны соответствовать этому.
Есть ли строка формата для этого?
ОБНОВЛЕНИЕ № 1
Я добавил фактические даты в виде открытого текста после строки ввода даты.
ОБНОВЛЕНИЕ № 2
Точный синтаксический анализ имеет перегрузку, которая позволяет передавать несколько строк формата. Это, кажется, правильный путь.
Итак, первая попытка была использовать:
DateTime.ParseExact("1-01-01T00:00:00+00:00 ", new[] { "yyyy-MM-ddTHH':'mm':'sszzz", "yyy-MM-ddTHH':'mm':'sszzz", "yy-MM-ddTHH':'mm':'sszzz", "y-MM-ddTHH':'mm':'sszzz" }, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.AssumeLocal)
Но, к сожалению, это не дает правильного результата, первая строка даты анализируется как:01.01.2001
скорее, чем01.01.0001
Таким образом, теперь возникает вопрос: какова правильная строка для анализа года, которая представлена только одной цифрой?
6 ответов
Обновлено на основе комментариев:
string y = "yyyy-MM-ddTHH':'mm':'sszzz";
string testDate = "1-01-05T00:00:00+00:00".PadLeft(25, '0');
Console.WriteLine(DateTime.ParseExact(testDate, y, CultureInfo.InvariantCulture));
testDate = "2011-12-14T15:53:40+00:00".PadLeft(25, '0');
Console.WriteLine(DateTime.ParseExact(testDate, y, CultureInfo.InvariantCulture));
Выход:
1/5/0001 00:00:00
12/14/2011 15:53:40
Я думаю, вы можете использовать перегрузку ParseExact для соответствия нескольким форматам.
Смотрите MSDN.
Попробуйте заполнить строку так, чтобы год длился 4 цифры. Вы, вероятно, должны добавить 2, 20 или 201, а не просто 0.
Я не думаю, что вам нужно соответствовать год от 1 до 4 символов, но 2 или 4 символа.
Для этого примера
1-01-05T00:00:00+00:00
вам нужно что-то вроде
д-ММ-yyTHH':' мм ':'sszzz
Если входные форматы не все одинаковы, вам нужно либо прекратить использовать точный синтаксический анализ, либо вызвать его с различными аргументами формата в зависимости от формата входных данных.
Поскольку вы знаете, что должны поддерживать несколько форматов, я предлагаю использовать метод TryParseExact.
Если он не может выполнить синтаксический анализ с использованием одного формата (т. Е. Возвращает false), попробуйте следующий формат.