【问题标题】:When parsing datetime into month day with English culture, it is still parsed in Turkish language使用英语将日期时间解析为月日时,仍以土耳其语进行解析
【发布时间】:2015-05-15 13:54:03
【问题描述】:

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

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

【问题讨论】:

  • 查看我编辑的答案

标签: c# string datetime string-formatting culture


【解决方案1】:

Convert.ToDateTime(srRegisterDate) still 根据日期和月份名称使用您的 CurrentCulture,它看起来像 tr-TRCumartesi - 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);

【讨论】:

  • 不,这不是问题,问题是将DateTime 转换为字符串。 String.Format 忽略了文化参数。
  • @Habib 骗我。谢谢。现在看起来像你的解决方案:(
【解决方案2】:

问题是由于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[])

【讨论】:

    【解决方案3】:

    这行得通

    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 日,星期六

    【讨论】:

    • 这不是 OP 想要的。
    • 是的,这会起作用,但还有另一个问题不需要String.Format,您的格式将被忽略,因为您传递的是字符串参数而不是DateTime 参数。使用您的代码考虑示例 string result = String.Format("{0:yyyy-MM-dd}", Convert.ToDateTime(srRegisterDate, trDtfi).ToString(usDtfi));
    • 是的,我注意到很高兴解决文化转型.. sry OP
    • 再次,使用您的 EDIT string test = String.Format("{0:dddd, MMMM d, yyyy}", Convert.ToDateTime(Convert.ToDateTime(srRegisterDate, trDtfi).ToString(usDtfi))); ,您将字符串转换为 DateTime,然后将其转换为字符串,然后再次将其转换为 DateTime 以传递给 String.Format,您看到问题了吗用那个?
    • 显然我不那么开导我,我不介意失去代表,我想知道最好的方法。最终结果给出了 OP 所期望的结果
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多