使用动态cultureInfo返回日期

时间:2014-10-15 13:31:16

标签: c# datetime cultureinfo

目前我正在返回这样的日期:

string returnValue = DateTime.Now.ToString("d MMMMMMMMMMMMMM yyyy");

问题是,如果运行该程序的人来自美国,我需要像这样返回:2014年10月15日

当用户运行程序时,我可以使用此代码更改cultureinfo(这是有效的):

Thread.CurrentThread.CurrentCulture = new CultureInfo(SelectedLanguage.LanguageCode);

我可以用

string returnValue = DateTime.Now.ToString("d MMMMMMMMMMMMMM yyyy");
if(Thread.CurrentThread.CurrentCulture == "en-US") {
    returnValue = DateTime.Now.ToString("MMMMMMMMMMMMMM d, yyyy");
}

但如果还有另一个区域,我需要添加另一个if语句...我不能用动态代码写这个,所以我有一行代码的格式正确吗?

2 个答案:

答案 0 :(得分:1)

如果您可以略微更改您的要求,您可以为所有文化使用标准格式(如“D”)(或其他有意义的standard format):

DateTime.Now.ToString("D"); // i.e., Monday, June 15, 2009

否则,您可以使用Dictionary<CultureInfo, string>创建文化/格式对的查找,然后使用它而不是长if / else链:

var formatLookup = new Dictionary<CultureInfo, string>();
formatLookup.Add(CultureInfo.GetCultureInfo("en-us"), "MMMMMMMMMMMMMM d, yyyy");

然后你可以像这样使用它:

string format;

if (!formatLookup.TryGetValue(Thread.CurrentThread.CurrentCulture, out format))
{
    // This would be the default format if none is found for the current culture:
    format = "d MMMMMMMMMMMMMM yyyy";
}

string returnValue = DateTime.Now.ToString(format);

如果您使用资源文件本地化您的应用程序,则会存在另一个选项。如果是这种情况,您可以将每种语言的格式存储在资源字符串中。假设有当前文化的本地化文件,ResourceManager会自动选择正确的格式。

答案 1 :(得分:0)

您可以实现一个简单的文化提供者/帮助器(让它成为扩展方法),将逻辑集中在一个地方

public static class CultureHelper
{
    public static string ToCultureSpecificString(this DateTime @this)
    {
        // do formatting as you like, check current country, user nationality, etc.
        // var result = @this.ToString("dd/MM/yyyy");
        return result;
    }
}

并将其用于所有DateTime这样的

string returnValue = DateTime.Now.ToCultureSpecificString();