在.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”。
如何构建一个自定义格式字符串,将日期部分的顺序考虑在内?
答案 0 :(得分:3)
使用自定义格式字符串时,您可以指定所需的确切部分以及字符串中的位置。这正是发生的事情。
已经具有文化意识的格式字符串,因为日期分隔符占位符(/
)确实输出了正确的字符 - .
。
除了构建不同的自定义格式字符串以适应不同的文化之外,你无能为力。
这可以放在资源文件中进行国际化,例如保存在字典中。
答案 1 :(得分:2)
假设所有传播的文化都有一个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
,这是没有年份的月 - 日组合的标准格式。