Я рассмотрел ответ на вопрос Parse very long date format to DateTime in C#, и это немного помогает устранить мою проблему, но я боюсь, что смогу споткнуться о несвязанной проблеме и, таким образом, открыть этот новый поток.ParseExact не обрабатывает строку с днем, датой с порядковым номером, но не год
Даты входят в мой процесс как строка, в которой я не контролирую. Они всегда представляют дату в будущем. Примером может служить «Wednesday 26th November at 18:30
». Обратите внимание: день имеет порядковый номер и что нет года.
Мне нужно установить их в структуру DateTime
, чтобы я мог ... ну, сделайте DateTime
вещи им!
В настоящее время я использую следующий фрагмент (скорректированный с учетом вышеупомянутого вопроса), но он по-прежнему не работает на последнем условном условии, который я ожидаю, что он пройдет.
public DateTime ParseOrdinalDateTime(string dt)
{
DateTime d;
if (DateTime.TryParseExact(dt, "dddd d\"st\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd d\"nd\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd d\"rd\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd d\"th\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
return d;
throw new InvalidOperationException("Not a valid DateTime string");
}
Ответ ниже определяет вашу проблему, но помните, что TryParseExact принимает также массив строк форматирования. Создавая массив ожидаемых форматов и передавая его вместо вызова в 4 раза, TryParseExact должен улучшить читаемость вашего кода. – Steve
Спасибо Стив. Да, я заметил это, но пока не был уверенным разработчиком C#, я хотел исключить это как проблему и хотел сосредоточиться на применении отдельных тестов. Теперь я буду комбинировать макеты формата с массивом String, как это было предложено. – belial
Одна вещь, о которой я не совсем понимаю, это то, как она выбирает годную часть даты. Является ли анализатор достаточно умным, чтобы определить это на основе полей DayOfWeek и DayOfMonth? Будет ли он всегда выбирать дату в будущем? C# foo требуется за пределами моего мастерства, чтобы проверить это, я думаю. – belial