2016-05-25 18 views
1

Ich kann wie so einen String-Wert in YYYYMMDD-Format in eine menschenfreundlichere Zeichenfolge konvertieren:Wie kann ich einen MediumDateString bekommen?

string beginDate = GetElement(3, fileBaseName); 
string endDate = GetElement(4, fileBaseName); 
beginDate = DateTime.ParseExact(beginDate, 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture).ToShortDateString(); 
endDate = DateTime.ParseExact(endDate, 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture).ToShortDateString(); 
return string.Format("{0} to {1}", beginDate, endDate); 

Aber mit ToShortDateString() wie oben, erhalte ich das nicht-so-freundlich-as-Wunschformat „2016.04.01 bis 2016.04.30

Wenn ich versuche, ToLongDateString(), es zu weit in die andere Richtung geht, die Zahlen in Monatsnamen erweitert (was ich will), aber auch die lange Form des Wochentags, so dass die gleichen Werte angezeigt als „Freitag, 1. April 2016 bis zum Samstag, 30. April 2016

Was ich wirklich will, ist für den Datumsbereich angezeigt werden sollte als "1. April 2016 bis 30. April 2016 "(oder" 1. April 2016 bis 30. April 2016 „)

gibt es einen Mittelweg zwischen ToShortDateString() und ToLongDateString(), die ich verwenden kann, oder muss ich "meine eigenen rollen", um dies zu bekommen?

Antwort

4

Sie können Ihre eigenen benutzerdefinierten Format (MMMM d, yyyy) verwenden:

beginDate = DateTime.ParseExact(beginDate, 
           "yyyyMMdd", 
           CultureInfo.InvariantCulture) 
        .ToString("MMMM d, yyyy"); 


endDate = DateTime.ParseExact(endDate, 
           "yyyyMMdd", 
           CultureInfo.InvariantCulture) 
        .ToString("MMMM d, yyyy"); 

return string.Format("{0} to {1}", beginDate, endDate); 

Ausgang:

April 1, 2016 to April 30, 2016 
+1

Vorsicht vor ParseExact und Datum Umstellung auf lokale Kalender, auch sicherstellen, dass Sie die Art danach angeben, wenn das Ergebnis nicht als UTC – Jay

+0

übersetzt bekommt Es ist „01“ anstelle von „1“ für das Datum, aber nahe genug, für mich für jetzt. –

+1

@ B.ClayShannon: aktualisiert, verwenden Sie nur ein "d" in diesem Fall. –

5

Nein, es gibt nichts zwischen diesen beiden in .NET - wenn man sich DateTimeFormatInfo suchen Sie werde siehe ShortDatePattern und LongDatePattern, aber kein "mittleres Datumsmuster".

Wenn Sie alle Kulturen kennen, die Sie behandeln müssen, können Sie die Anzeige für jede von ihnen anpassen - aber ich würde vermeiden, eine benutzerdefinierte Format Zeichenfolge anzugeben, wo Sie nicht über die Kultur in Frage wissen. (Wenn Sie einige Kulturen kennen, aber keine anderen, könnten Sie die Formatzeichenfolge für diejenigen hart codieren, die Sie kennen, und einfach das lange oder kurze Muster für die anderen verwenden - so würde es nicht ganz so schön sein, aber zumindest du würdest etwas nicht unbedingt kulturell inkompetent machen.)

1

Um genau das zu bekommen, was ich wollte (keine vorangestellte "0" vor dem ersten des Monats), musste ich tatsächlich "meine eigene" rollen:

private static string ToMediumDateString(string _date) 
{ 
    string yearPortion = _date.Substring(0, 4); 
    int monthNum = Convert.ToInt32(_date.Substring(4, 2)); 
    int dayNum = Convert.ToInt32(_date.Substring(6, 2)); 
    string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNum); 
    return String.Format("{0} {1}, {2}", monthName, dayNum, yearPortion); 
}