.NET中自定义支持不同文化的日期格式

7
在.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”。

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

2个回答

3
当使用自定义格式字符串时,您可以指定所需的确切部分以及它们应在字符串中的位置。这正是正在发生的事情。
您拥有的格式字符串已经具有文化意识,因为日期分隔符占位符(/)确实输出了正确的字符-一个点。
除了构建不同的自定义格式字符串以适应不同的文化之外,您没有太多其他选择。
这可以放在国际化资源文件中或例如保存在字典中。

2
假设所有通过的文化都有一个包含MMMddd的ShortDatePattern,以某种顺序和某种分隔符(我想不出公历日历的例外情况,但可能我错了),则以下内容将起作用:
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。这基本上就是上面所做的事情。 - Jon Hanna
@Oded 哦,等等,有一个区别,但这是一个积极的区别,它将保留在月份和日期之间的任何内容,而不是 /,虽然不应该需要这样做(/ 应该作为适当的分隔符工作),但是因为某些格式直接编码本地分隔符,而不是使用 / - Jon Hanna

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