2014-11-02 3 views
3

Я рассмотрел ответ на вопрос 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"); 
} 
+3

Ответ ниже определяет вашу проблему, но помните, что TryParseExact принимает также массив строк форматирования. Создавая массив ожидаемых форматов и передавая его вместо вызова в 4 раза, TryParseExact должен улучшить читаемость вашего кода. – Steve

+2

Спасибо Стив. Да, я заметил это, но пока не был уверенным разработчиком C#, я хотел исключить это как проблему и хотел сосредоточиться на применении отдельных тестов. Теперь я буду комбинировать макеты формата с массивом String, как это было предложено. – belial

+0

Одна вещь, о которой я не совсем понимаю, это то, как она выбирает годную часть даты. Является ли анализатор достаточно умным, чтобы определить это на основе полей DayOfWeek и DayOfMonth? Будет ли он всегда выбирать дату в будущем? C# foo требуется за пределами моего мастерства, чтобы проверить это, я думаю. – belial

ответ

3

Если вы получаете время 24-часовом формате, то вы должны разобрать строку как "dddd d\"th\" MMMM \"at\" HH:mm" (обратите внимание на заглавную Hs).

1

1) своп чч: мм до HH: мм (с использованием 24 часа ..)
2) Установить культуру EN-US

, такие как

string dateString = "Wednesday 26th November at 18:30"; 
string format = "dddd d\"th\" MMMM \"at\" HH:mm"; 
DateTime dt; 
DateTime.TryParseExact(dateString, format, new CultureInfo("en-US"), DateTimeStyles.AssumeLocal, out dt); 

редактировать - отформатированы

1

Ваша строка формата немного неактивна, и вам необходимо установить культуру:

private static void Main(string[] args) 
{ 
    DateTime result = ParseOrdinalDateTime("Friday 29th August at 18:30"); 
} 

public static DateTime ParseOrdinalDateTime(string dt) 
{ 
    DateTime d; 

    if (DateTime.TryParseExact(dt, "dddd d\"th\" MMMM \"at\" HH:mm", CultureInfo.CreateSpecificCulture("en-GB"), DateTimeStyles.AssumeLocal, out d)) 
    { 
     return d; 
    } 

    throw new InvalidOperationException("Not a valid DateTime string"); 
} 
+0

Да, спасибо за добавление CultureInfo. Я наткнулся на это, но снова хотел уменьшить вероятность того, что именно по этой причине мой синтаксический анализ был проблемой. Я все еще удивлен тем, что C# не поддерживает даты (или цифры в этом отношении) с встроенными ординалами ... особенно, если мы пройдем через rigmarole добавления CultureInfo! – belial

Смежные вопросы