2013-06-29 4 views
1

Я хочу, чтобы разобрать строки с датой, которые могут иметь различные форматы, такие как:C#: преобразовать строку в DateTime

"21.12.12", "4,12,2011", "30 июня 11", «16 12 2013 »,« Апрель 2013 »,« 12. Апрель 2012 »,« 12, März 2011 ».

У меня есть этот код:

string[] ll = {"en-US", "de-DE"}; 
date = "4,12,2011"; 
foreach (string l in ll) { 
    if (DateTime.TryParse(date, new CultureInfo(l), 
          DateTimeStyles.None, out pDate)) { 
     return pDate;//.ToString("dd.MM.yyyy"); 
    } 
} 

И у меня есть проблемы с датами, как это:

"21.12.12" анализируется как "21 декабря 2012", и это ОК

"4,12,2011" обрабатывается как "12 апреля 2011", это не нормально, мне нужно "4 декабря 2011"

Как установить порядок на День и месяц?

Это должно быть За день до месяца.

+1

4,12,2011 является * действительной * строкой как для 12 апреля, так и 4 декабря. Код не имеет способа узнать, что именно означает, если вы не укажете формат. –

+1

Клянусь, это спрашивает soooooo много раз. Это, безусловно, дубликат. –

ответ

0

Это характерно для культуры en-US. Это может быть странно для нас, европейцев, но американцы действительно пишут месяц за днем ​​в датах. Вместо этого вы можете использовать en-GB - он будет обрабатывать те же названия месяцев и европейский порядок.

3

Чтобы указать формат (ы) строки, которую вы передаете, вы должны использовать метод ParseExact.

+0

Но если вы не знаете, что такое точный формат, это не поможет, если вы не можете предложить код, который бы с удовольствием проанализировал «21.12.12» и «12. Апрель 2012» так же легко ... Культуры - это путь к go ... – Chris

+1

Одна из перегрузок позволяет указать более одного формата. –

+0

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

1

По вашему коду

string[] ll = {"en-US", "de-DE"}; 

вы сначала попробуйте проанализировать DateTime с культурой "EN-US"; поэтому «4,12,2011» будет разобран , так как американцы делают - ММ/ДД/ГГГГ - месяц первый (12 апреля). Изменение порядка в массиве

string[] ll = {"de-DE", "en-US"}; 

и «4,12,2011» будет 4 декабря

2

Использование DateTime.ParseExact, он также перегрузка тх позволяет передавать string[[] для всех разрешенных форматов.

string[] dates = new[] { "21.12.12", "4,12,2011", "30 Jun 11", "16 12 2013", "April 2013", "12. April 2012", "12, März 2011" }; 
CultureInfo germanCulture = CultureInfo.CreateSpecificCulture("de-DE"); // you are using german culture 
string[] formats = new[] { "dd/MM/yy", "d,MM,yyyy", "dd MMM yy", "dd MM yyyy", "MMMM yyyy", "dd. MMMM yyyy", "dd, MMMM yyyy"}; 

foreach (string dateString in dates) 
{ 
    DateTime dt = DateTime.ParseExact(dateString, formats, germanCulture, DateTimeStyles.None); 
    Console.WriteLine(dt.ToString()); 
} 

Я использовал немецкую культуру, потому что ваши строки даты содержат немецкие месячные имена. Таким образом, этот код работает, даже если текущая культура отличается.

+0

Вам не нужен синтаксический анализ, если у вас есть правильная культура. Используя 'Parse' и' de-DE', все эти строки работают без необходимости использовать все возможности в форматах. – Chris

2

Все даты проверок, которые вы дали, фактически проанализировали правильно в культуре de-DE, которую вы указали. Проблема заключается в том, что вы сначала пытаетесь разобрать ее в американской культуре, где они используют форматы mm.dd.yyyy.

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

В этом случае, хотя они выглядят как приемлемые de-DE строки даты, поэтому вы можете просто анализировать их так, чтобы они не нуждались в цикле попыток разных культур (что, как уже упоминалось, вряд ли будет идеальным результатом).

+0

+1 для «всех дат правильно разобрать», я не проверял, что хотя моя культура «de-De»;) –

+0

@TimSchmelter: Я тестировал в основном потому, что мне было любопытно, почему en-us был там в первое место. Очевидно, это была причина проблемы, поэтому я пытался решить, какую другую проблему она должна решить. Тогда я обнаружил, что это не проблема. :) – Chris

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