在文化变量的年份格式化本地化日期

时间:2013-10-04 15:50:22

标签: c# asp.net-mvc

我需要将日期显示在M / dd或dd / M中,具体取决于当前设置的文化。在我们的应用程序中,我们基于配置明确设置文化。我们目前使用以下方法格式化日期:

string dateStringFormat =Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;

someDate.ToString(dateStringFormat)

这将生成格式化为我们的设置文化的所需日期字符串(I.E. 10/4/2013或4.10.2013)。但是,如果我需要日期不包括年份,我该如何做,仍然可以变量?如果我做someDate.ToString("dd/MM", dateStringFormat)这样的事情,那么无论文化如何,它都不会以日/月的形式保存吗?希望我的问题很清楚。感谢您提供任何可能的帮助。

5 个答案:

答案 0 :(得分:3)

尝试使用Month format specifier。例如,这个:

var d = new DateTime(2013, 10, 04);
var str = d.ToString("M");
Console.WriteLine(d);

将在 en-US 文化中输出以下内容:

  

10月04日

pr-BR 文化中的以下内容:

  

4 de outubro

这是您可以做的最好的事情,因为可能没有定义的约定,只显示日期的月份和日期部分作为数字。

答案 1 :(得分:2)

我相信你所寻找的是不可能的,因为在文化中没有定义日/月的特定顺序(我认为有些情况下,不同格式的同一文化中的两种排序都是可能的。)

你确实可以从中获取ShortDatePattern并删除年份部分,或者使用日/月顺序构建自己的部分。

将应用程序重新设计为显示完整格式,或显示月份名称+日期,或以其他方式明确指定是日期还是月份可能更安全。 04/10/13:)

答案 2 :(得分:1)

我一直在寻找相同的东西,并与之相关(基本上是Chris Pratt的回答)。

    var model = new List<string>();
    string pat;
    string[] cultures = { "en-GB", "en-US", "ja-JP", "fr-FR" };
    DateTime date1 = new DateTime(2011, 5, 1);

    foreach (var culture in cultures)
    {
        DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture(culture).DateTimeFormat;
        pat = dtfi.ShortDatePattern.Replace("/yyyy", "").Replace("yyyy/", "");

        model.Add(
            String.Format("{0} Date ({1}): {2}", culture, pat, date1.ToString(pat, dtfi))
            );
    }

可以根据需要添加更多Replace次来电,以满足其他文化需求。 这是一个ASP MVC项目(因此&#34;模型&#34;)。您可能希望将model.Add替换为Console.WriteLine

此示例的输出为:

en-GB Date (dd/MM): 01/05
en-US Date (M/d): 5/1
ja-JP Date (MM/dd): 05/01
fr-FR Date (dd/MM): 01/05

答案 3 :(得分:0)

有点好,但为什么不在结果字符串上使用Remove

var dateString = someDate.ToString(dateStringFormat);
var dateStringWithoutYear = dateString.Remove(dateString.Length - 5);

答案 4 :(得分:0)

出于提问者的相同原因,我来到了这篇文章。但是,在测试解决方案时,我通过不同的文化提出了问题。

只想分享我的最终解决方案,该解决方案适用于.Net中的所有中性文化:

    private static string GetPatternWithoutYear(string pattern)
    {
        if (pattern.EndsWith("yyyy"))
            pattern = pattern.Substring(0, pattern.Length - 5);
        else if (pattern.StartsWith("yyyy"))
            pattern = pattern.Substring(5);
        // some even end with yyyy.
        else if (pattern.EndsWith("yyyy."))
            pattern = pattern.Substring(0, pattern.Length - 5);
        else if (pattern.EndsWith("yy"))
            pattern = pattern.Substring(0, pattern.Length - 3);
        // and some seldom with yy.
        else if (pattern.EndsWith("yy."))
            pattern = pattern.Substring(0, pattern.Length - 3);
        // bul
        else if (pattern.EndsWith("yyyy 'г.'"))
            pattern = pattern.Substring(0, pattern.Length - 9);
        // tuk
        else if (pattern.EndsWith(".yy 'ý.'"))
            pattern = pattern.Substring(0, pattern.Length - 8);
        return pattern;
    }

经过以下测试(我不会将结果粘贴太长):

        var cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
        foreach (var culture in cultures)
        {
            string pattern = culture.DateTimeFormat.ShortDatePattern;
            pattern = GetPatternWithoutYear(pattern);

            Console.WriteLine($"{culture.ThreeLetterISOLanguageName}: {culture.DateTimeFormat.ShortDatePattern.PadRight(12)} {pattern.PadRight(8)} {DateTime.Now.ToString(pattern)}");
        }

结果的第一行:

ivl: MM/dd/yyyy   MM/dd    03.05
aar: dd/MM/yyyy   dd/MM    05.03
afr: yyyy-MM-dd   MM-dd    03-05
agq: d/M/yyyy     d/M      5.3
aka: yyyy/MM/dd   MM/dd    03.05
amh: dd/MM/yyyy   dd/MM    05.03
ara: dd/MM/yy     dd/MM    05.03
arn: dd-MM-yyyy   dd-MM    05-03
asm: dd-MM-yyyy   dd-MM    05-03
asa: dd/MM/yyyy   dd/MM    05.03
ast: d/M/yyyy     d/M      5.3
aze: dd.MM.yyyy   dd.MM    05.03
aze: dd.MM.yyyy   dd.MM    05.03
aze: dd.MM.yyyy   dd.MM    05.03
bak: dd.MM.yy     dd.MM    05.03
...