非美国文化中具有DateTime的String.FormatException
我得到一个String.FormatException试图转换/解析一个字符串当文化不是非美国。 奇怪的是,字符串是通过应用与用于将其解析回字符串的格式和文化完全相同的格式和文化生成的。 在下面的代码中,所有这些版本都将失败:
const string culture =“ja-JP”; const string format =“dd MMM yyyy”; //包括{0:}的原始post中的错误 CultureInfo info = new CultureInfo(culture); Thread.CurrentThread.CurrentCulture = info; Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture); // string toParse = String.Format(info,format,DateTime.Now); //原帖中的错误 string toParse = DateTime.Now.ToString(format); System.Diagnostics.Debug.WriteLine(string.Format(“Culture format = {0},Date = {1}”,culture,toParse)); 尝试 { DateTime输出= DateTime.ParseExact(toParse,format,CultureInfo.InvariantCulture); // DateTime output = DateTime.ParseExact(toParse,format,info); // DateTime output = DateTime.ParseExact(toParse,format,info,DateTimeStyles.None); // DateTime output = Convert.ToDateTime(toParse,info); } catch(Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); }
请注意,en-US的字符串是“2010年2月25日”。 ja-JP的字符串是“25 2 2010”。
任何想法如何让“25 2 2010”回到约会?
提前致谢。
编辑1:我应该注意日本文化在这里只是作为一个例子进行硬编码。 我真的需要这个来处理用户设置的任何文化。 我需要的是一个解决方案,无论用户的文化是什么,日期时间格式都有效。 我认为单身M就是这么做的。
编辑2:M不适用于英语。 有人知道一个适用于所有文化的格式字符串吗?
如果你改变:
DateTime output = DateTime.ParseExact( toParse, format, CultureInfo.InvariantCulture);
至
DateTime output = DateTime.ParseExact(toParse, "dd MMM yyyy", info);
日期被正确解析。
请注意,在您的示例中,您使用文化(ja-JP)转换为字符串,而另一种文化转换为字符串。 另一个问题是String.Format
接受一个复合格式字符串( "My string to format - {0:dd MMM yyyy}"
),但DateTime.ParseExact
只接受日期时间格式。
解析日期时尝试使用单个M. 这就是日本文化的MonthDayPattern示例中使用的内容。
const string format = "{0:dd M yyyy}";
string text = "25 2 2009"; DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);
传递给DateTime.ParseExact
的格式模式必须只是日期模式,没有占位符。 对于JP文化,您只需要使用一个M
因为即使在转换为字符串时指定了MMM
,日期也会由数字表示。
const string culture = "ja-JP"; const string FROM_STRING_FORMAT = "dd M yyyy"; const string TO_STRING_FORMAT = "{0:" + FROM_STRING_FORMAT + "}"; CultureInfo info = new CultureInfo(culture); Thread.CurrentThread.CurrentCulture = info; Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture); string toParse = String.Format(info, TO_STRING_FORMAT, DateTime.Now); Console.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse)); try { DateTime output = DateTime.ParseExact(toParse, FROM_STRING_FORMAT, CultureInfo.InvariantCulture); Console.WriteLine(output); } catch (Exception ex) { Console.WriteLine(ex.Message); }