2012-01-09 9 views
7

En .NET, la mayoría de las cadenas estándar utilizadas para formatear un valor de DateTime son respetuosas con el cultivo; por ejemplo, la cadena de formato ShortDatePattern ("d") cambia el orden del año/mes/partes del día en torno dependiendo de la cultura actual:Formato de fecha de cultivo personalizado en .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) 

necesito algo similar para un formato de fecha que contiene sólo mes y día:

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) 

utilizando, por ejemplo la cadena de formato personalizado "MM/dd" no funciona; incorrectamente mostrará "01.11" para el 11 de enero en la cultura alemana, cuando quiero que muestre "11.01".

¿Cómo puedo crear una cadena de formato personalizado que tome en cuenta el orden de las partes de la fecha?

Respuesta

2

Suponiendo que todas las culturas pasaron tendrá un ShortDatePattern que contiene M o MM y d o dd en algún orden con algún tipo de separador (no puedo pensar en una excepción para el calendario gregoriano, pero podría estar equivocado) a continuación, el siguiente trabajo:

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; 
} 

Si la suposición es muy lejos pegaban mucho, entonces va a volver a ShortDatePattern, aunque también podría terminar mostrando sólo la fecha o sólo el mes.

No incluye correctamente los separadores en el extremo u otros indicadores cuando corresponde. Por ejemplo, convierte el formato estándar (yyyy-MM-dd) en MM-dd en lugar de --MM-dd, que es el formato estándar para las combinaciones de mes a día sin año.

+0

Me gusta la idea, aunque ¿no basta simplemente con quitar todo lo que no está en '['M', 'd', '/']' y recortar '/' del resultado? – Oded

+0

@Oded. Eso es más o menos lo que hace arriba. –

+0

@Oded oh wait, hay una diferencia, pero es positiva, esto mantendrá todo lo que esté entre el mes y la fecha que no sea '/', lo que no debería ser necesario ('/' debería funcionar como el separador apropiado) porque algunos formatos tienen el separador local codificado directamente en lugar de usar '/'. –

3

Al utilizar una cadena de formato personalizada , especifique las partes exactas que necesita y dónde deben estar en la cadena. Esto es exactamente lo que está sucediendo.

La cadena de formato que tiene es culturalmente consciente ya, como el marcador de posición separador de fecha (/) está hecho emitiendo el carácter correcto - un ..

Además de construir diferentes cadenas de formato personalizado para adaptarse a las diferentes culturas, no hay mucho más que pueda hacer.

Esto se puede poner en un archivo de recursos para la internacionalización o en un diccionario, por ejemplo.

Cuestiones relacionadas