【问题标题】:Formatting a localized date with out the year when the culture is variable当文化是可变的时,格式化一个没有年份的本地化日期
【发布时间】:2019-03-05 12:28:06
【问题描述】:

我需要根据当前设置的文化以 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) 之类的事情,不管文化如何,那不是总是保持日/月格式吗?希望我的问题足够清楚。感谢您提供任何可能的帮助。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    尝试使用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。 @Stavros_S - 我认为“M”是您在帖子中描述的问题的最佳直接支持选项(不幸的是,这对您不起作用)...我仍然会尝试从短日期格式或长日期格式中选择订单,而不是将一个硬编码为美国/非美国...
    • @AlexeiLevenkov 我有一些方法必须创建一个实用方法,我将日期传递给它并让它返回正确的字符串格式。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我一直在寻找同样的东西并选择了这个(本质上是 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.Add 替换为 Console.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

      【讨论】:

      • 这个解决方案只会打击不使用“/”作为日期分隔符的任何文化,您必须使用 DateTimeFormatInfo.DateSeparator 概括您的答案。
      【解决方案4】:

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

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

      【讨论】:

      • 代码需要比硬编码的长度更复杂......像M/yyyy/d这样的东西不起作用......
      • 什么是最好的年假方法?
      【解决方案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
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-15
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多