.NET中的自定义文化感知日期格式

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

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

假设传递的所有文化都有一个ShortDatePattern包含MMMddd按某种顺序使用某种分隔符(我不能想到格里高利历的exception,但我可能错了)那么以下内容将起作用:

 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 ,这是没有年份的月 – 日组合的标准格式。

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

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

除了构建不同的自定义格式字符串以适应不同的文化之外,您无法做其他事情。

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