设置本地化日期的格式,而不显示区域性可变的年份

本文关键字:区域性 显示 日期 本地化 格式 设置 | 更新日期: 2023-09-27 18:33:52

我需要根据当前设置的区域性将日期显示在 M/dd 或 dd/M 中。在我们的应用程序中,我们根据配置显式设置区域性。我们目前使用以下方法格式化日期:

string dateStringFormat =Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;
someDate.ToString(dateStringFormat)

这将生成所需的日期字符串,格式设置为我们设置的区域性(即 10/4/2013 或 4.10.2013)。但是,如果我需要日期不包括年份,我该怎么做并且仍然使其可变?如果我做类似的事情someDate.ToString("dd/MM", dateStringFormat)那么无论文化如何,它不会总是保持日/月格式吗?希望我的问题足够清楚。感谢您提供任何可能的帮助。

设置本地化日期的格式,而不显示区域性可变的年份

尝试使用月份格式说明符。例如,这个:

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

将在 en-US 区域性中输出以下内容:

十月 04

在 pr-BR 文化中,以下内容:

4 de outubro

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

我相信

您正在寻找的内容是不可能的,因为在文化中没有定义特定的日/月顺序(我认为在某些情况下,对于不同的格式,在同一文化中可以同时进行两种排序)。

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

重新设计应用程序以显示完整格式、显示月份名称 + 日,或者以其他方式显式指定它是天还是月,可能会更安全。 13-10-04 :)

我正在寻找同样的东西并接受了这个(本质上是克里斯普拉特答案的变体)。

    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项目(因此称为"模型")。您可能希望将model.Add替换为 Console.WriteLine

此示例的输出为:

en-GB 日期 (日/月): 01/05美国日期(周一/日):5/1JA-JP 日期 (月/日): 05/01周五至周五日期 (日/月): 01/05

有点曲棍,但为什么不只在生成的字符串上使用Remove呢?

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

我从提问者那里得出这篇文章的原因完全相同。然而,在测试解决方案时,我在不同的文化中提出了问题。

只是想分享我的最终解决方案,它适用于 .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
...