.NET中的自定义区域性日期格式

本文关键字:日期 格式 区域性 自定义 NET | 更新日期: 2023-09-27 18:19:45

在.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"自定义格式字符串不起作用;在德国文化中,它将错误地显示1月11日的"01.11",而我希望它显示"11.01"

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

.NET中的自定义区域性日期格式

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

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

除了构建不同的自定义格式字符串以适应不同的文化之外,没有什么其他的事情可以做

例如,这可以放在用于国际化的资源文件中,也可以保存在字典中。

假设所有传递的区域性都有一个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,后者是没有年份的月-日组合的标准格式。