当区域设置可变时,如何格式化本地化日期但不包括年份?

4

我需要让我的日期显示为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)这样做,那么它不管文化如何都会保持在日/月格式中吗?希望我的问题足够清晰。感谢任何可能的帮助。
5个回答

3

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

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

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

10月4日

并在 pr-BR 文化中输出以下内容:

10月4日

这是最好的方法,因为可能没有定义仅以数字显示日期的月份和日期部分的约定。


1
是的,不幸的是,它需要基于设计保持数字值。如果它不是美国文化,我可能会编写某种条件来更改它...这很丑陋 :( - Stavros_S
+1. @Stavros_S - 我认为"M"是您在帖子中描述的问题的最佳直接支持选项(但不幸的是对您无效)...我仍然会尝试从短日期格式或长日期格式中选择顺序,而不是将其硬编码为美国/非美国... - Alexei Levenkov
@AlexeiLevenkov 我需要编写一个实用方法,将日期作为参数传入,并返回正确的字符串格式。 - Stavros_S

2

我也在寻找同样的东西,最终选择了这个(基本上是 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项目(因此称为"model")。您可能想将model.Add替换为Console.WriteLine
此示例的输出为:
en-GB日期(dd/MM):01/05 en-US日期(M/d):5/1 ja-JP日期(MM/dd):05/01 fr-FR日期(dd/MM):01/05

这个解决方案在任何不使用“/”作为日期分隔符的文化中都会出现问题,你必须使用DateTimeFormatInfo.DateSeparator来概括你的答案。 - schlingel

2
我相信你所寻找的是不可能的,因为没有文化定义了特定的日期/月份顺序(我认为在同一文化中对于不同格式可能存在两种排序方式的情况)。
你确实可以使用ShortDatePattern并从中去掉年份部分或使用日/月顺序来构建自己的格式。
重新设计你的应用程序以显示完整格式、显示月份名称+日期或其他明确指定是日还是月的方式可能更加安全。04/10/13 :)

0
有点不太专业,但为什么不直接在结果字符串上使用Remove呢?
var dateString = someDate.ToString(dateStringFormat);
var dateStringWithoutYear = dateString.Remove(dateString.Length - 5);

1
代码需要比硬编码的长度更加详细,例如 M/yyyy/d 这样的格式是行不通的。 - Alexei Levenkov
最好的方法是如何截取年份? - Stavros_S

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
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接