带有动态文化信息的返回日期

本文关键字:返回 日期 信息 文化 动态 | 更新日期: 2023-09-27 18:26:39

目前我返回的日期如下:

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语句。。。我不能用动态代码写这个吗,所以我用一行代码就有了正确的格式?

带有动态文化信息的返回日期

如果您可以稍微更改您的需求,您可以对所有文化使用类似"D"的标准格式(或另一种有意义的标准格式):

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将自动选择正确的格式。

您可以实现一个简单的区域性提供程序/帮助程序(让它成为扩展方法),将逻辑集中在一个地方

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();