Разобрать в формат DateTime (M) M / (d) д / гг (ч) ч: мм тт - PullRequest
0 голосов
/ 11 мая 2018

Я думал, что это будет легко: Я хочу разобрать следующий формат строки в DateTime:

"4/25/18 15:11"

и это намного сложнее, чем я ожидал.

DateTime.Parse просто возвращает исключение Input string not in the correct format

DateTime.TryParseExact является ближайшим из всех, к которым я пришел, и может анализировать эту точную строку, но не учитывает, когда день, месяц, час (и т. Д.) Заканчиваются (или ниже, в зависимости от маски) 9, так как маска должна точно соответствовать, иначе она потерпит неудачу.

string input = "4/25/18 3:11 PM";
string input2 = "1/1/18 10:10 AM";
DateTime theDate;
DateTime.TryParseExact(input, "M/dd/yy h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out theDate);

Моей следующей идеей было разделить 4, 25, 18 и добавить 0, если они <10, и 20, объединенные до 18, но это кажется излишним. Это также оставляет мне время и условия, основанные на том, является ли <code>tt AM или PM.

РЕДАКТИРОВАТЬ: На основе некоторых комментариев ....

У меня нет контроля над входной строкой.

Convert.ToDateTime("25/4/18 3:11 PM") выдает исключение {"String was not recognized as a valid DateTime."}

Когда я указал дату ввода как 25.04.18, формат ввода явно M / dd / yy. К сожалению, это может означать, что вводимая дата может быть ММ / д / гг и т. Д. Мы можем предположить, что она всегда будет Месяц / День / Год.

TLDR: Как я могу чисто проанализировать input и input2 в DateTime?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете изменить свой код, чтобы он был таким, и тогда он должен принимать оба формата с одной и двумя цифрами:

DateTime.TryParseExact(
    input, "M/d/yy h:mm tt",CultureInfo.InvariantCulture, DateTimeStyles.None,
    out var theDate);

Компоненты с одним символом M, d и h в строке формата допускают использование одной или двух цифр.

Fiddle

0 голосов
/ 11 мая 2018

Если код выполняется в локали США и , строка даты известна или ожидается, что будет действительным форматом даты США:

Convert.ToDateTime("4/25/18 3:11 PM")

Для других локалей (при условии ввода строкидопустимо в текущей культуре) попробуйте эту перегрузку:

Convert.ToDateTime("25/4/18 3:11 PM", System.Globalization.CultureInfo.CurrentCulture)

Однако, если я правильно понимаю, основываясь на вашей редакции и комментариях, вы ожидаете, что дата всегда будет в формате M / D / Y (US):

У меня нет контроля над строкой ввода.

Convert.ToDateTime("25/4/18 3:11 PM") выдает исключение {"String was not recognized as a valid DateTime."}

Когда я указал дату ввода как 4/25/ 18, входной формат явно M / dd / yy.К сожалению, это может означать, что вводимая дата может быть ММ / д / гг и т. Д. Мы можем предположить, что она всегда будет Месяц / День / Год.

Конечно.В этом случае вы пытаетесь казнить против недопустимой даты в США, по культуре США.Но если вы можете предположить, что формат даты, представленный в строке, всегда будет месяц / день / год, то вы должны быть в состоянии сделать:

 Convert.ToDateTime("4/25/18 3:11 PM", new System.Globalization.CultureInfo("en-US"))

Это работает, независимо от того, указаны ли месяц / день в одиночном илидвузначный, и должен возвращать действительный DateTime объект на основе предполагаемой строки даты в США.

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