2016-09-07 3 views
0

Я довольно новичок в C#.Получение дат с несколькими возможными форматами из строки в C#

Мне нужно создать скрипт, который читает строку и пытается преобразовать ее в Date.

Проблема являются:

-The даты бывают разных форматов. (Международный, Американский, Японский)

-Время выпускаются с различными разделителями или вообще отсутствуют.

-The год может быть полным или только 2 позиции

Я начал путем замены возможных разделителей:

dateinstring = dateinstring.Replace("-",""); 
dateinstring = dateinstring.Replace(".",""); 
dateinstring = dateinstring.Replace("/",""); 

Затем проверьте длину, чтобы увидеть, если год будет завершен (31102012 или 311012 для пример)

if(dateinstring.lenght = 8){ 
//check format with complete date 
}else{ 
//check format with reduced year 
} 

Теперь я споткнулся upen эту функцию: DateTime.TryParseExact которая, кажется, сделать то же самое, но она возвращает логическое значение (истина или ложь) и нет сама дата.

Я что-то упустил? Существуют ли методы на C#, которые уже делают это, или я должен продолжить свое решение?

+2

Существует аргумент 'out' - [' out DateTime result'] (https://msdn.microsoft.com/en-us/library/ms131044 (v = vs.110) .aspx) –

+1

Метод ' TryParseExact' имеет параметр 'out', который задан в методе. Взгляните на пример на странице MSDN https://msdn.microsoft.com/en-us/library/h9b85w22(v=vs.110).aspx –

+1

Что такое формат «Международный»? Стандарт ISO? (То же самое, что и у японцев, если у вас только есть дата) –

ответ

1

Вот функция, которую я использую в проекте, когда встроенный синтаксический анализ не работает - поэтому он охватывает только дополнительные форматы, а не стандартные.

private DateTime? TryParseNumberString(string dateText) 
{ 
    // additional date format options to be accepted 
    var extraDateFormats = new[] 
    { 
     "d.M.", 
     "d.M", 
     "ddMMyyyy", 
     "ddMMyy", 
     "ddM" 
    }; 
    foreach (var item in extraDateFormats) 
    { 
     DateTime test; 
     if (DateTime.TryParseExact(dateText, item, null, System.Globalization.DateTimeStyles.AssumeLocal, out test)) 
     { 
      return test; 
     } 
    } 
    return null; 
} 

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

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

Вы также можете попробовать DateTime.TryParse(input, culture, DateTimeStyles.None, out result) с различными значениями culture, чтобы попытаться разобрать английский, японский и другие по соглашению.

+0

Почему бы не использовать [перегрузка 'DateTime.TryParseExact()'] (https://msdn.microsoft.com/en-us/library/h9b85w22 (v = vs.110).aspx), который позволяет вам передать массив форматов даты, чтобы попробовать? –

+0

@MatthewWatson практически, ваше замечание, вероятно, присутствует, но я не могу найти какую-либо документацию прямо сейчас, которая гарантирует порядок оценки, если несколько форматов соответствуют одной и той же строке. – grek40

+0

Да, документация не очень ясна об этом, но если вы проверите исходный код на источнике ссылок, вы увидите, что он циклически становится очевидным (т. Е. По порядку элементов в массиве) –

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