具有不同文化的日期时间值未正确格式化

时间:2013-02-07 13:55:32

标签: c# datetime localization cultureinfo

我在线程文化方面遇到了一些问题,并且正确显示日期。 我正在重载DateTime类的ToString()方法。

随着文化“en-CA”,我的日期将以正确的格式“yyyy / MM / dd”出现 但是对于文化“fr-CA”,我的约会对象是“yyyy-MM-dd”

我做了一些单元测试来显示问题。 英语测试有效但法语总是失败。

即使我更改了GetDateInStringMethod来执行.ToShortDateString。我仍然遇到同样的问题。

[Test()]
public void ValidInEnglish()
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-CA");
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = Utility.DatePattern;
    DateTime? currentDate = new DateTime(2009,02,7);
    string expected = "2009/02/07";
    string actual = DateUtils.GetDateInString(currentDate);

//This works
    Assert.AreEqual(expected, actual);
}

[Test()]
public void ValidInFrench()
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA");
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = Utility.DatePattern;
    DateTime? currentDate = new DateTime(2009, 02, 7);
    string expected = "2009/02/07";
    string actual = DateUtils.GetDateInString(currentDate);
// This doesn't work
    Assert.AreEqual(expected, actual);
}

public static string GetDateInString(DateTime? obj)
{
    if (obj == null || !obj.HasValue)
    {
        return string.Empty;
    }

    return obj.Value.ToString(Utility.DatePattern);
}

public const string DatePattern = "yyyy/MM/dd";

2 个答案:

答案 0 :(得分:3)

更改此行:

return obj.Value.ToString(Utility.DatePattern);

到此:

return obj.Value.ToString(Utility.DatePattern, CultureInfo.InvariantCulture);

在此处阅读:System.Globalization.InvariantCulture

答案 1 :(得分:2)

这不起作用,因为使用法国文化默认日期时间格式化程序使用-而不是/作为分隔符。

如果您想保持日期相同,无论文化如何,请使用CultureInfo.InvariantCulture

如果您想使用法语格式化更改您的预期测试结果到"2009-02-07"

如果您正在寻找更多信息,请查看this msdn link

如果你想要一个lib的个人推荐用于处理全球化的可怕性,那么我建议Noda Time