Точная дата разбора в c # с переменной продолжительностью года - PullRequest
0 голосов
/ 14 декабря 2011

Я пытаюсь найти подходящую строку формата для анализа (точного) следующих типов дат:

  • 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 ]

2 голосов
/ 14 декабря 2011

Полагаю, вы можете использовать перегрузку ParseExact для соответствия нескольким форматам.

См. MSDN .

1 голос
/ 14 декабря 2011

Обновлено на основе комментария:

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
0 голосов
/ 14 декабря 2011

Поскольку вы знаете, что должны поддерживать несколько форматов, я предлагаю использовать метод TryParseExact.

Если не удается выполнить синтаксический анализ с использованием одного формата (т. Е. Он возвращает false), попробуйте следующий формат.

0 голосов
/ 14 декабря 2011

Попробуйте дополнить вашу строку так, чтобы год имел длину 4 цифры. Вы, вероятно, должны добавить 2, 20 или 201, а не просто 0.

0 голосов
/ 14 декабря 2011

Я не думаю, что вам нужно совпадать с годом от 1 до 4 символов, но 2 или 4 символа.

Для этого примера

1-01-05T00: 00: 00 + 00: 00

вам нужно что-то вроде

D-ММ-yyTHH ':' мм ':' sszzz

0 голосов
/ 14 декабря 2011

Если входные форматы не все одинаковы, вам нужно либо прекратить использовать точный синтаксический анализ, либо вызвать его с другими аргументами формата в зависимости от формата входных данных.

...