2012-01-09 53 views
7

在.NET中,用于格式化日期时间值的大多数标准字符串都是文化感知的,例如ShortDatePattern(“d”)格式字符串可切换年/月的顺序/天左右部分根据当前文化:.NET中的自定义文化感知日期格式

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

假设通过将有一个包含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,这是没有年份的月份组合的标准格式。

+0

我喜欢这个想法 - 虽然不会简单地去除不在'['M','d','/']'中的任何内容,并且从结果中修剪'/'就足够了吗? – Oded 2012-01-09 10:57:36

+0

@Oded。这几乎是上面所做的。 – 2012-01-09 11:41:12

+0

@O oh oh等待,但有一个区别,但它是一个积极的,这将保持月份和日期之间不是'/'的东西,虽然不应该有这样的需要('/'应该作为适当的分隔符),这是因为某些格式具有直接编码的本地分隔符,而不是使用'/'。 – 2012-01-09 14:39:11

3

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

你有格式字符串是文化已经意识到,作为日期分隔符占位符(/)确实输出正确的字符 - .

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

这可以放在一个资源文件国际化或举行字典为例。