【问题标题】:Custom culture aware date format in .NET.NET 中的自定义文化感知日期格式
【发布时间】:2012-01-09 10:19:49
【问题描述】:

在 .NET 中,用于格式化 DateTime 值的大多数标准字符串都是文化感知的,例如 ShortDatePattern ("d") 格式字符串会根据当前的情况切换年/月/日部分的顺序文化:

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)
6/15/2009 1:45:30 PM -> 15/06/2009 (fr-FR)
6/15/2009 1:45:30 PM -> 15.06.2009 (de-DE)

对于仅包含月份和日期的日期格式,我需要类似的东西:

6/15/2009 1:45:30 PM -> 6/15 (en-US)
6/15/2009 1:45:30 PM -> 15/06 (fr-FR)
6/15/2009 1:45:30 PM -> 15.06. (de-DE)

使用例如“MM/dd”自定义格式字符串不起作用;当我希望它显示“11.01”时,它会在德国文化中错误地显示 1 月 11 日的“01.11”。

如何构建一个考虑日期部分顺序的自定义格式字符串?

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    当使用 custom 格式字符串时,您可以指定所需的确切部分以及它们应该在字符串中的位置。这正是正在发生的事情。

    您拥有的格式字符串已经具备文化意识,因为日期分隔符占位符 (/) 确实输出了正确的字符 - .

    除了构建不同的自定义格式字符串以适应不同的文化之外,您无能为力。

    这可以放在资源文件中以进行国际化或保存在例如字典中。

    【讨论】:

      【解决方案2】:

      假设通过的所有文化都将有一个 ShortDatePattern,其中包含 MMMddd 以某种顺序使用某种分隔符(我想不出公历的例外情况,但我可能是错的)那么以下将起作用:

      private static string FindMonthDayOnly(System.Globalization.CultureInfo ci)
      {
        string shortPattern = ci.DateTimeFormat.ShortDatePattern;
        while(shortPattern[0] != 'd' && shortPattern[0] != 'M')
        {
          shortPattern = shortPattern.Substring(1);
          if(shortPattern.Length == 0)
            return ci.DateTimeFormat.ShortDatePattern;
        }
        while(shortPattern[shortPattern.Length - 1] != 'd' && shortPattern[shortPattern.Length - 1] != 'M')
        {
          shortPattern = shortPattern.Substring(0, shortPattern.Length - 1);
          if(shortPattern.Length == 0)
            return ci.DateTimeFormat.ShortDatePattern;
        }
        return shortPattern;
      }
      

      如果假设非常不匹配,那么它将恢复为ShortDatePattern,尽管它也可能最终只显示日期或月份。

      它未能正确包括末尾的分隔符或其他适当的指示符。例如,它将标准格式 (yyyy-MM-dd) 转换为 MM-dd,而不是 --MM-dd,这是没有年份的月日组合的标准格式。

      【讨论】:

      • 我喜欢这个想法 - 虽然不会简单地删除任何不在 ['M', 'd', '/'] 中的内容并从结果中删除 / 就足够了吗?
      • @Oded。上面的内容差不多就是这样。
      • @Oded 哦,等等,这是有区别的,但这是一个积极的方面,这将保留月份和日期之间不是 / 的任何内容,虽然不应该有需要这样(/ 应该作为适当的分隔符)是因为某些格式直接编码本地分隔符而不是使用 /
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2014-08-17
      • 2021-03-31
      相关资源
      最近更新 更多