将 datetime 解析为具有英语文化的月日时,仍将其解析为土耳其语

When parsing datetime into month day with English culture, it is still parsed in Turkish language

这是代码。我仍然得到不正确的结果

string srRegisterDate = "25.07.2009 00:00:00"
CultureInfo culture = new CultureInfo("en-US");
srRegisterDate = String.Format("{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(srRegisterDate), culture);

结果是Cumartesi, Temmuz 25, 2009

应该是Saturday, July 25, 2009

我该如何解决这个错误?

C#.net v4.5.2

Convert.ToDateTime(srRegisterDate)仍然使用你的CurrentCulture which looks like tr-TR based on day and month names. Cumartesi - Temmuz

String.Format 中,您的文化将被忽略,因为您将它用作第三个参数作为参数,但您从未使用过它。

您的代码调用了 Format(string format, object arg0, object arg1) 重载。但是你从不使用arg1。这种超载并不认为这是一种文化。它认为您要格式化的是 另一个 参数。

这个 String.Format 有一个重载,将 IFormatProvider 作为 第一个 参数。

例如;

srRegisterDate = String.Format(culture, "{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(srRegisterDate));

但获得所需结果的最常用方法(我总是喜欢)是使用 .ToString() 方法,例如;

srRegisterDate = Convert.ToDateTime(srRegisterDate).ToString("dddd, MMMM d, yyyy", culture);

问题是因为 忽略了 String.Format 中的文化价值,而不是因为将字符串转换为 DateTime

你需要:

srRegisterDate = String.Format(culture, "{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(srRegisterDate));

您当前对 String.Format 的调用实现了重载 String.Format Method (String, Object[]) 并且传入的 culture 参数被视为为占位符传递的简单对象参数。由于没有占位符,您甚至不会看到它被忽略。

如果你想在 String.Format 中使用 culture 那么你必须使用重载:Format(IFormatProvider, String, Object)String.Format Method (IFormatProvider, String, Object[])

这个有效

DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo trDtfi = new CultureInfo("tr-TR", false).DateTimeFormat;
string result = String.Format("{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(srRegisterDate, trDtfi).ToString(usDtfi));

原创

25.07.2009 00:00:00

变身

2009 年 7 月 25 日 12:00:00 上午

编辑

比要求少一分

string test = String.Format("{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(Convert.ToDateTime(srRegisterDate, trDtfi).ToString(usDtfi)));

2009 年 7 月 25 日星期六