在非美国文化中使用DateTime的String.FormatException

syd*_*yos 8 c# culture datetime

我得到一个String.FormatException试图转换/解析文化不是非美国时的字符串.奇怪的是,字符串是通过应用与用于将其解析回字符串的格式和文化完全相同的格式和文化生成的.在下面的代码中,所有这些版本都将失败:

const string culture = "ja-JP";
const string format = "dd MMM yyyy"; //error in orignal post included {0:}
CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);

//string toParse = String.Format(info, format, DateTime.Now); //error in original post
string toParse = DateTime.Now.ToString(format);
System.Diagnostics.Debug.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
    DateTime output = 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不适用于英语.有人知道一个适用于所有文化的格式字符串吗?

Joã*_*elo 3

如果你改变:

DateTime output = DateTime.ParseExact(
    toParse, format, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

DateTime output = DateTime.ParseExact(toParse, "dd MMM yyyy", info);
Run Code Online (Sandbox Code Playgroud)

日期已正确解析。

请注意,在您的示例中,您使用区域性 (ja-JP) 转换为字符串,但使用另一种区域性从字符串转换。另一个问题是String.Format接受复合格式字符串 ( "My string to format - {0:dd MMM yyyy}"),但DateTime.ParseExact只期望日期时间格式。