2010-12-28 12 views
14

Wie bekomme ich unten erwähnt, Datumsformat in C#.Wie erstelle ich ein Datumsformat wie "1. November" in C#

  • Für 1-Nov-2010 sollte es sein Display als: 1. November

  • Für 30-Nov-2010 sollte es Display als sein:

30. November Können wir tun Verwenden Sie ein beliebiges Datumsformat oder erstellen Sie eine benutzerdefinierte Funktion, die für 1 -> 'st', 2-> 'nd' 3-> 'rd', beliebiges Datum -> 'th' zurückgibt.

Antwort

32

Der folgende Code basiert auf diesem answer, die eine Ordnungs aus einer ganzen Zahl erzeugt:

public static string ToOrdinal(int number) 
{ 
    switch(number % 100) 
    { 
     case 11: 
     case 12: 
     case 13: 
      return number.ToString() + "th"; 
    } 

    switch(number % 10) 
    { 
     case 1: 
      return number.ToString() + "st"; 
     case 2: 
      return number.ToString() + "nd"; 
     case 3: 
      return number.ToString() + "rd"; 
     default: 
      return number.ToString() + "th"; 
    } 
} 

als Sie Ihre Ausgabezeichenfolge erzeugen kann:

public static string GenerateDateString(DateTime value) 
{ 
    return string.Format(
     "{0} {1:MMMM}", 
     ToOrdinal(value.Day), 
     value);    
} 
+0

wirklich tolle Antwort :) –

+0

Es ist wirklich fantastisch. Spart viel Zeit. :) – SarangK

0

Ich bin mir ziemlich sicher, dass es keine Datenzeitroutine gibt, um das Datum als 1. oder 30. anzuzeigen.

Ich schrieb vor kurzem einen Code wie das von Grund auf neu. Ich denke, du musst dasselbe tun.

Ich habe meinen Code nicht griffbereit, aber ich habe nur ein String-Array mit den Buchstaben für jede Nummer erstellt ("th", "st", "nd", "rd", "th", etc.). Dann mod gegen 10 und benutze den Rest als ein Index in das Array. Sie können diese Zeichenfolge einfach an Ihre Nummer anhängen.

+0

Ich denke auch gleich. –

+1

Mod gegen 10 ist nicht gut genug, denn dann hätten Sie den 11. und den 12.. –

+0

Ja, ich weiß, ich habe es funktioniert. Ich glaube, ich hatte ein paar Ausnahmen für die Teenager. –

0

Sie können Regular Expressions verwenden, um den Tag und den Monat zu extrahieren. Speichern Sie dann alle Namen der Monate in einem Array und verwenden Sie die .startsWith, um den richtigen Namen des Monats zu erhalten. Sie können eine einfache case verwenden, um zu sehen, ob Sie die 'st', 'nd', 'rd' oder 'th' brauchen.

1

Somthing wie dies funktionieren sollte ...

using System; 
using System.Text; 

namespace Program { 


class Demo { 
     static string[] extensions = 
     // 0  1  2  3  4  5  6  7  8  9 
     { "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th", 
     // 10 11 12 13 14 15 16 17 18 19 
      "th", "th", "th", "th", "th", "th", "th", "tn", "th", "th", 
     // 20 21 22 23 24 25 26 27 28 29 
      "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th", 
     // 30 31 
      "th", "st" }; 

    public static void Main() { 
    String strTestDate = "02-11-2007"; 
    DateTime coverdate = DateTime.ParseExact(strTestDate, "dd-MM-yyyy", null); 
    string s = coverdate.ToString(" MMMM yyyy"); 
    string t = string.Format("{0}{1}",coverdate.Day,extensions[coverdate.Day]); 
    string result = t + s; 


    } 
    } 
} 
2

Also hier ist eine umfassende Lösung mit Erweiterungsmethoden. Funktioniert für C# 3.0 und höher. Meist plagiiert der Nikhil Arbeit:

public static class DateTimeExtensions 
{ 
     static string[] extensions = // 0 1 2 3 4 5 6 7 8 9 
      { "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th", 
       // 10 11 12 13 14 15 16 17 18 19 
       "th", "th", "th", "th", "th", "th", "th", "tn", "th", "th", 
       // 20 21 22 23 24 25 26 27 28 29 
       "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th", 
       // 30 31 
       "th", "st" 
      }; 
     public static string ToSpecialString(this DateTime dt) 
     { 
      string s = dt.ToString(" MMMM yyyy"); 
      string t = string.Format("{0}{1}", dt.Day, extensions[dt.Day]); 
      return t + s; 
     } 
} 

Test/Zeichen verwendet werden:

Console.WriteLine(DateTime.Now.ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 11, 12).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 1, 1).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 1, 2).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 1, 3).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 1, 4).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 12, 15).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 8, 19).ToSpecialString()); 
Console.WriteLine(new DateTime(1990, 9, 22).ToSpecialString()); 
Console.ReadKey(); 

Hoffe, das hilft.

0

Ich folgte die String Beispiel Blog von JSL vscontrol und es einen Fehler am Ende hat er vergessen, die Tageszahl am Anfang der Zeile zu verketten, so dass es

return strNum + ordinal + str; 

und nicht sein soll!

return ordinal + str; 
+0

private statische Zeichenfolge Ordinal (DateTime Datum) { int dayvalue = Convert.ToInt32 (Datum.Tag); Zeichenfolge strNum = dayvalue.ToString(); Zeichenfolge ordinal = string.Empty; if (strNum.EndsWith ("0") || strNum.EndsWith ("4") || strNum.EndsWith ("5") || strNum.EndsWith ("6") || strNum.EndsWith ("7") || strNum.EndsWith ("8") || strNum.EndsWith ("9")) { ordinal = "th"; } sonst if (strNum.EndsWith ("1")) { ordinal = "st"; } sonst if (strNum.EndsWith ("2")) { ordinal = "nd"; } sonst { ordinal = "rd"; } Zeichenfolge str = date.ToString ("MMMMM yyyy"); Rückkehr ordinal + str; } –