Точная дата разбора в 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), попробуйте следующий формат.

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