4

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

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

someDate.ToString(dateStringFormat)

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

4

5 回答 5

3

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

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

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

10 月 4 日

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

4 de outbro

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

于 2013-10-04T16:27:46.817 回答
2

我相信您正在寻找的东西是不可能的,因为在文化中没有定义特定的日/月顺序(而且我认为在某些情况下,对于不同格式的相同文化,两种排序都是可能的)。

您确实可以从中ShortDatePattern删除年份部分或使用日/月顺序来构建您自己的。

重新设计您的应用程序以显示完整格式,或显示月份名称 + 日期,或以其他方式明确指定它是日还是月,可能会更安全。2013 年 4 月 10 日 :)

于 2013-10-04T16:17:41.597 回答
2

我一直在寻找同样的东西并随之而来(本质上是克里斯普拉特答案的变体)。

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

此示例的输出为:

zh-CN 日期 (dd/MM): 01/05
zh-CN 日期 (M/d):5/1
ja-JP 日期 (MM/dd): 05/01
fr-FR 日期 (dd/MM): 01/05
于 2017-09-01T13:47:03.900 回答
0

有点做作,但为什么不只Remove在结果字符串上使用呢?

var dateString = someDate.ToString(dateStringFormat);
var dateStringWithoutYear = dateString.Remove(dateString.Length - 5);
于 2013-10-04T16:14:49.300 回答
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
...
于 2019-03-05T04:28:06.030 回答