2016-12-12 7 views
0

Мне нужно выполнить тысячи документов Word и создать из них XML-файлы. Все работает отлично, за исключением полей «Дата», потому что я работаю на двух языках.Преобразование строки Date и Time to DateTime

Вот несколько примеров

  • ДАТА: 24 ноября 2016 ВРЕМЯ: 15:31
  • ДАТА: 28 NOVEMBRE 2016 HEURE: 10H31

Я очистки до строки бит используя ниже, но я все еще получаю печально известную строку String не был признан действительным DateTime. '

IFormatProvider culture = null; 
if (m.rdoEnglish.IsChecked == true) 
{ 
    culture = new System.Globalization.CultureInfo("en-CA", true); 
} 
else if (m.rdoFrench.IsChecked == true) 
{ 
    culture = new System.Globalization.CultureInfo("fr-CA", true); 
} 

string dt = ""; 
dt = m.txtPublished.Text; 

if (dt.IndexOf("HEURE:") != -1) 
{ 
    dt = dt.Replace("HEURE:", ""); 
} 

if (dt.IndexOf("H") != -1) 
{ 
    dt = dt.Replace("H", ":"); 
} 
DateTime dt2; 
dt2 = DateTime.ParseExact(dt, "MM/dd/yyyy HH:mm:ss tt", culture); 

//Cleaned string looks like this " 28 NOVEMBRE 2016 10:31 " 
return dt2; 
+0

Очищенная строка не похожа на строку формата, которую вы передаете в 'ParseExact()'. Попробуйте сделать их совпадающими. – itsme86

+0

'dt = dt.Replace (" H ",": ");' будет заменять каждый «H» 'на':: ', что вызовет проблемы с такими месяцами, как« MARCH ». – Quantic

ответ

-1

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

Настройка оба культуры:

IFormatProvider englishCulture = new System.Globalization.CultureInfo("en-CA", true); 
IFormatProvider frenchCulture = new System.Globalization.CultureInfo("fr-CA", true); 

Затем используйте TryParse с одной культурой, и если это не удается повторить попытку с другой:

DateTime output; 
if (DateTime.TryParseExact(input, frenchFormatString, frenchCulture, out output)) 
{ 
    // Read it successfully 
} 
else if (DateTime.TryParseExact(input, englishFormatString, englishCulture, out output)) 
{ 
    // Read it successfully 
} 
else 
{ 
    // Unknown format, try something else? 
} 

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

Строки формата могут содержать все дополняющие слова, а также заполнители для фактических данных. Есть даже перегрузка TryParseExact, которая берет массив строк формата, чтобы вы могли настроить все (или, по крайней мере, большинство) форматов, с которыми вы столкнетесь.

0

Похоже, что ваша строка формата неправильная, в свете двух приведенных вами примеров. Это должно быть что-то вроде «MMMM дд, гггг чч: мм» Подробнее об этом по адресу: DateTime.ParseExact Method

0

ParseExact, а TryParseExact, имеет перегрузку, которая принимает массив форматов для использования в разборе строки , Это позволит вам использовать что-то вроде этого

string test = dt.Replace("DATE: ", "") 
       .Replace("TIME: ", "") 
       .Replace("HEURE: ", ""); 

string[] formats = new string[] 
{ 
    "MMMM dd, yyyy HH:mm", "dd MMMM yyyy HH\'H\'mm" 
}; 
DateTime dt2 = DateTime.ParseExact(test, formats, culture, DateTimeStyles.None); 

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