我必须运行数千个Word文档并从中创建XML文件。除了日期字段外,一切正常,因为我使用两种语言。
以下是一些例子
我使用下面的方法对字符串进行了一些清理,但我仍然认为臭名昭着的字符串未被识别为有效的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 :(得分:0)
根据您提供的两个示例,您的格式字符串看起来不正确。 它应该像“MMMM dd,yyyy hh:mm” 阅读更多相关信息: DateTime.ParseExact Method
答案 1 :(得分: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,因为我不知道在您的月份中是否出现相同的字符。
答案 2 :(得分:-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
的重载也需要一系列格式字符串,因此您可以设置所有(或至少大部分)您遇到的格式。