2012-01-09 11 views
7

W .NET, większość standardowych łańcuchów używanych do formatowania wartości DateTime ma znaczenie kulturowe, np. Tekst w formacie ShortDatePattern ("d") zmienia kolejność roku/miesiąca/dzień wokół części w zależności od aktualnej kultury:Format daty dostosowany do potrzeb kulturowych w .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) 

muszę coś podobnego do formatu daty zawierające tylko miesiąc i dzień:

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) 

Stosując np Łańcuch formatu niestandardowego "MM/dd" nie działa; niepoprawnie wyświetli "01.11" na 11 stycznia w kulturze niemieckiej, kiedy chcę, aby wyświetlał "11.01".

Jak mogę utworzyć niestandardowy ciąg formatujący uwzględniający kolejność części daty?

Odpowiedz

2

Zakładając wszystkie kultury przekazywane będą miały ShortDatePattern zawierający M lub MM i d lub dd w pewnym porządku z jakiegoś separatora (nie mogę myśleć o wyjątek dla kalendarza gregoriańskiego, ale mogę się mylić), a następnie dodaje zadziała:

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

Jeżeli założenie jest bardzo daleko sparowane Pokochasz go przywrócić ShortDatePattern, choć może też skończyć pokazując tylko datę lub tylko miesiąc.

Nieprawidłowo nie zawiera separatorów na końcu lub innych wskaźników, gdy jest to właściwe. Na przykład zamienia standardowy format (yyyy-MM-dd) na MM-dd zamiast --MM-dd, który jest standardowym formatem dla kombinacji miesiąc-dzień bez roku.

+0

Podoba mi się pomysł - choć nie wystarczyłoby po prostu wyjąć z niego wszystko, czego nie ma w "[" M "," d ","/"]" i przyciąć "/" z rezultatu? – Oded

+0

@Oded. Dokładnie to, co powyżej. –

+0

@Odbyłem czekać, jest różnica, ale jest to pozytywne, to zachowa wszystko, co jest pomiędzy miesiącem a datą, która nie jest '/', która nie powinna być potrzebna ('/' powinien działać jako odpowiedni separator), ponieważ niektóre formaty mają lokalny separator kodowany bezpośrednio, a nie przez użycie '/'. –

3

Podczas korzystania z ciągu formatu niestandardowego, określasz dokładnie te części, których potrzebujesz i gdzie w ciągu znaków powinny być. Dokładnie to się dzieje.

Ciąg formatu masz jest kulturowo świadomy już, jako posiadacz separator daty miejscu (/) rzeczywiście jest wyprowadzanie prawidłowy charakter - ..

Oprócz tworzenia różnych niestandardowych ciągów formatów dopasowanych do różnych kultur, niewiele można zrobić.

Można to umieścić w pliku zasobów w celu internacjonalizacji lub przechowywania w słowniku na przykład.