.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"
如何构建一个将日期部分的顺序考虑在内的自定义格式字符串?
当使用自定义格式字符串时,您可以指定所需的确切部分以及它们在字符串中的位置。这正是发生的事情。
您拥有的格式字符串已经具有文化意识,因为日期分隔符占位符(/
)确实输出了正确的字符-.
。
除了构建不同的自定义格式字符串以适应不同的文化之外,没有什么其他的事情可以做
例如,这可以放在用于国际化的资源文件中,也可以保存在字典中。
假设所有传递的区域性都有一个ShortDatePattern,它以某种顺序包含M
或MM
、d
或dd
,并带有某种分隔符(我想不出格里高利日历有什么例外,但我可能错了),那么以下内容将起作用:
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
,后者是没有年份的月-日组合的标准格式。