2009-09-08 8 views
14

Szukam lokalnie świadomego sposobu na uzyskanie długiej daty bez dnia tygodnia. Po prostu taka bestia istnieje?Jak otrzymać format Long Date z DateTime bez dnia tygodnia

Poniżej znajduje się kod mogę użyć, aby uzyskać długi format daty w tym dniu tygodnia:

DateTime time = ... 
String formattedDate = time.ToLongDateString(); 

Edycja

Przykłady tego, co chciałbym zobaczyć:

  • pl -us: 5 grudnia 2009 r.
  • fr-fr: 5 décembre 2009
  • es-es: 05 de diciembre de 2009

ToLongDateString() zwraca następujący:

  • en-us: Sobota, 5 grudnia 2009
  • fr-FR: samedi 5 décembre 2009
  • es-es: sábado, 05 de diciembre de 2009

Odpowiedz

8

To wydawało się rade.

  1. wyliczyć wszystkie ważne wzory datetime: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. Wybierz najdłuższy wzorca (prawdopodobnie jest to najlepszy mecz), że:
    • Czy podciąg z CultureInfo.DateTimeFormat.LongDatePattern
    • Nie zawiera "ddd" (nazwa krótkiego dnia)
    • Nie zawiera "dddd" (nazwa długiego dnia)

Wygląda na to, że wymyślam ciągi, których szukałem.

patrz kod poniżej:

class DateTest 
{ 
    static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo) 
    { 
     string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns(); 

     string longPattern = cultureInfo.DateTimeFormat.LongDatePattern; 

     string acceptablePattern = String.Empty; 

     foreach (string pattern in patterns) 
     { 
      if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd")) 
      { 
       if (pattern.Length > acceptablePattern.Length) 
       { 
        acceptablePattern = pattern; 
       } 
      } 
     } 

     if (String.IsNullOrEmpty(acceptablePattern)) 
     { 
      return longPattern; 
     } 
     return acceptablePattern; 
    } 

    static private void Test(string locale) 
    { 
     DateTime dateTime = new DateTime(2009, 12, 5); 

     Thread.CurrentThread.CurrentCulture = new CultureInfo(locale); 

     string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture); 

     string result = dateTime.ToString(format); 

     MessageBox.Show(result);    
    } 
} 

Technicznie, to prawdopodobnie nie będzie działać, jeśli długo Format miał nazwę dnia umieszczonej w środku. W tym celu powinienem wybrać wzór o najdłuższym wspólnym podciągu, zamiast najdłuższego dopasowania ścisłego.

0

Spróbuj:

DateTime time = .... 
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM"); 
2

Jeśli sekwencja LongDate jest również specyficzna dla kultury, to obawiam się, że nie masz szczęścia i będziesz musiał napisać odpowiedni kod. W przeciwnym razie kolekcja formatting tags wystarczy.

Obawiam się, że musisz utworzyć tablicę złożoną z 7 ciągów (po jednym na każdy dzień) w lokalnej kulturze i usunąć te łańcuchy z wyjścia formatu LongDate. Następnie upewnij się, że usuwasz wszystkie zduplikowane/-S-y i spacje.

Mam nadzieję, że jest lepszy sposób, ale go nie widzę.

+0

Prośba o złym wyniku (ciąg z dnia tygodnia) i próbuje munge go do akceptowalnego postaci (usuwając dzień tygodnia) jest bardzo słaby substytut po prostu prosząc o sformatowanie w odpowiedni sposób ciągu daty. –

+0

@ Stephen: Zgadzam się. Ale skąd znasz właściwe formatowanie aktualnej kultury? Kolejność roku, miesiąca i dnia, znaki separatora itp. Itd. –

+1

@David - dokładnie tak, nie możesz. Jeśli to ma znaczenie, musisz zbadać odpowiednie formatowanie dla każdej kultury, tak jak zrobiła to firma Microsoft z cultureInfo.DateTimeFormat.LongDatePattern. –

3

Bardzo straszne, straszne drogą do osiągnięcia tego celu jest usunięcie formatami nie chcesz z istniejącego LongDatePattern:

public static string CorrectedLongDatePattern(CultureInfo cultureInfo) 
{ 
    var info = cultureInfo.DateTimeFormat; 

    // This is bad, mmmkay? 
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim(); 
} 
+0

To jest ładne i proste, ale nie obsługuje * wszystkich * przypadków. Na przykład ka-GE to "yyyy" წლის "dd MM, dddd". Ta odpowiedź pozostawiłaby koniec przecinka –

+0

Zgadzam się, to jest "bardzo okropne, okropne" rozwiązanie: D Możesz dodać to do regex: /,? \ S * dddd,?/ – user7116

+0

Myślę, że dodanie tego do regex pomogłoby , tak. –

5
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "") 
-1

Co złego:

var ci = CultureInfo.CreateSpecificCulture("nl-NL"); 
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci); 
+0

Zakłada się, że chcesz dd MMM rrrr, który użyłby nazwy miesiąca specyficznej dla lokalizacji, ale nie formatu. Zobacz przykłady w pytaniu. –

-1

Wystarczy określić format:

DateTime.ToString("MMMM dd, yyyy"); 
+0

Zakłada się, że chcesz MMMM dd, rrrr, który używałby nazwy miesiąca specyficznej dla lokalizacji, ale nie formatu. Zobacz przykłady w pytaniu. –

1

Jest to stary, stary THEAD, ale natknąłem się na nią, ponieważ doskonale dopasowane przypadku użycia Musiałem rozwiązać. Skończyłem na pisaniu kodu, który działa, więc pomyślałem, że dołączę go do tych, którzy go potrzebują. (Ma kilka dodatkowych sztuczek, jak zalegających do bieżącej daty i pozwalając zarówno pełną datę ciąg dla kultury, albo jeden z dzień-of-the-tygodniu usunięto):

public string DateString(DateTime? pDt = null, string lang, bool includeDayOfWeek = true) 
{ 
    if (pDt == null) pDt = DateTime.Now; 
    DateTime dt = (DateTime)pDt; 

    System.Globalization.CultureInfo culture = null; 
    try { culture = new System.Globalization.CultureInfo(lang); } 
     catch{ culture = System.Globalization.CultureInfo.InvariantCulture; } 

    string ss = dt.ToString("D", culture); 
    if (!includeDayOfWeek) 
    { 
     // Find day-of-week string, and remove it from the date string 
     // (including any trailing spaces or punctuation) 
     string dow = dt.ToString("dddd", culture); 
     int len = dow.Length; 
     int pos = ss.IndexOf(dow); 
     if (pos >= 0) 
     { 
      while (((len + pos) < ss.Length) && (!Char.IsLetterOrDigit(ss[len+pos]))) 
      len++; 
      ss = ss.Substring(0, pos) + ss.Substring(len+pos, ss.Length - (len+pos)); 
     } 
    } 
    return ss; 
} 
0

Dlaczego nie dostać LongDate i przyciąć pierwszą część, w której pojawia się dzień tygodnia?

DateTime date = Convert.ToDateTime(content["DisplayDate"]); 
    //-->3/15/2016 2:09:13 PM 

string newDate = date.ToString("D", new CultureInfo("es-ES")); 
    //--> martes, 15 de marzo de 2016 

var index = newDate.IndexOf(",") + 1; 
    //--> 7 

string finalDate = newDate.Substring(index); 
    //--> 15 de marzo de 2016 
+0

Ponieważ w niektórych kulturach dzień tygodnia może nie pojawić się z przodu. –

0

Stary post, ale używam tego:

public static string ToLongDateWithoutWeekDayString(this DateTime source) 
{ 
    return source.ToLongDateString() 
       .Replace(source.DayOfWeek.ToString(), "") 
       .Trim(',', ' '); 
} 
1

I Rozszerzyliśmy na sugestię przez Barta Calixto naprawić dd MMM formacie rrrr problem (tu w Australii używamy także datę UK format dd/mm/rr)

Potrzebuję też często konwersji między formatami dat Aust i US.

Kod ten rozwiązuje problem (moja wersja jest w VB)

Public Shared Function ToLongDateWithoutWeekDayString(source As DateTime, cult As System.Globalization.CultureInfo) As String 

Return source.ToString("D", cult).Replace(source.DayOfWeek.ToString(), "").Trim(","c, " "c) 

End Function 

Przed wywołaniem funkcji należy ustawić kulturę, robię to w ten sposób po otrzymaniu kraj odwiedzającego z http://ipinfo.io

Select Case Country.country 
      Case "AU" 
       cult = New CultureInfo("en-AU") 
      Case "US" 
       cult = New CultureInfo("en-US") 
      Case "GB" 
       cult = New CultureInfo("en-GB") 
     End Select 

Dim date1 As New Date(2010, 8, 18) 
lblDate.Text = ToLongDateWithoutWeekDayString(date1, cult) 

Po ustawieniu wyniku kultury AU lub GB na 18 sierpnia 2010 r.

Po ustawieniu wyniku kultury amerykańskiej na 18 sierpnia 2010 r.

Adam, czy zgadzasz się, że rozwiązuje to problem z formatowaniem, do którego się odnosisz?

Dzięki Bart to bardzo ładny kod.

Nie zapomnij dodać Dim cult As System.Globalization.CultureInfo po Dziedziczy System.Web.UI.Strona

+0

Proponuję zastąpienie 'source.DayOfWeek.ToString()' z 'source.ToString (" dddd ", kult)' tak, że działa z innymi językami, nie tylko po angielsku. –

0

Moje rozwiązanie:

DateTime date = DateTime.Now; 
CultureInfo culture = CultureInfo.CurrentCulture; 
string dayName = date.ToString("dddd", culture); 
string fullDate = date.ToString("f", culture); 
string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 

Ostatni wiersz:

  1. Usuwa resztki przecinek na początku
  2. Usuwa resztki przestrzeń na początku
  3. Usuwa resztki podwójnego miejsca z dowolnego miejsca na ciąg

Testowane dla każdej kultury z

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);