Frage

Ich muss in der Lage, einige Monatsnamen ich in einem Array zu vergleichen.

Es wäre schön, wenn es eine direkte Art und Weise ist wie:

Month.toInt("January") > Month.toInt("May")

Ihre Google-Suche scheint der einzige Weg zu legen nahe, ist Ihre eigene Methode zu schreiben, aber dies scheint wie ein gemeinsames genug Problem, dass ich denke, es wäre bereits in .NET implementiert worden wäre, jemand dies getan, vor?

War es hilfreich?

Lösung

DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month

Obwohl, für Ihre Zwecke, werden Sie wahrscheinlich besser dran, nur Dictionary<string, int> Erstellung des Namens des Monats abbildet, um seinen Wert.

Andere Tipps

Sie können etwas tun:

Convert.ToDate(month + " 01, 1900").Month

Wenn Sie die DateTime.ParseExact()-Methode verwenden, die mehrere Leute vorgeschlagen haben, sollten Sie sorgfältig überlegen, was Sie passieren soll, wenn die Anwendung in einem nicht-englischen Umgebung läuft!

In Dänemark, das von ParseExact("Januar", ...) und ParseExact("January", ...) sollen und welche funktionieren nicht?

Das wird die Differenz zwischen CultureInfo.CurrentCulture und CultureInfo.InvariantCulture sein.

Sie können die DateTime.Parse Methode verwenden, um ein Datetime-Objekt zu bekommen und dann seine Eigenschaft Monat zu überprüfen. Tun Sie etwas wie folgt aus:

int month = DateTime.Parse("1." + monthName + " 2008").Month;

Der Trick ist, ein gültiges Datum zu bauen ein Datetime-Objekt zu erstellen.

Sie können eine ENUM Monate verwenden:

public enum Month
{
    January,
    February,
    // (...)
    December,
}    

public Month ToInt(Month Input)
{
    return (int)Enum.Parse(typeof(Month), Input, true));
}

Ich bin nicht 100% sicher über die Syntax für Enum.Parse (), though.

Sie müssen nicht eine Datetime-Instanz erstellen, dies zu tun. Es ist so einfach, wie folgt aus:

public static class Month
{
    public static int ToInt(this string month)
    {
        return Array.IndexOf(
            CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
            month.ToLower(CultureInfo.CurrentCulture))
            + 1;
    }
}

Ich laufe auf der da-DK Kultur, so dass diese Einheit Test bestanden:

[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
    var actual = monthName.ToInt();
    Assert.Equal(expected, actual);
}

Ich werde es als Übung dem Leser überlassen eine Überlastung zu schaffen, wo Sie in einem expliziten Culture passieren kann.

Eine einfach Lösung wäre, ein Wörterbuch erstellen mit Namen und Werten. Dann mit contains () Sie den richtigen Wert finden.

Dictionary<string, string> months = new Dictionary<string, string>()
{
                { "january", "01"},
                { "february", "02"},
                { "march", "03"},
                { "april", "04"},
                { "may", "05"},
                { "june", "06"},
                { "july", "07"},
                { "august", "08"},
                { "september", "09"},
                { "october", "10"},
                { "november", "11"},
                { "december", "12"},
};
foreach (var month in months)
{
    if (StringThatContainsMonth.ToLower().Contains(month.Key))
    {
        string thisMonth = month.Value;
    }
}

Und die Beantwortung diese sieben Jahre nach der Frage gestellt wurde, ist es möglich, diesen Vergleich zu tun mit integrierten Methoden:

Month.toInt("January") > Month.toInt("May")

wird

Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("January", StringComparison.CurrentCultureIgnoreCase)) >
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("May", StringComparison.CurrentCultureIgnoreCase))

, die in eine Erweiterungsmethode können die Einfachheit halben Refactoring. Das Folgende ist ein Beispiel LINQPad (daher die Dump() Methodenaufrufe):

void Main()
{
    ("January".GetMonthIndex() > "May".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() == "january".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() < "May".GetMonthIndex()).Dump();
}

public static class Extension {
    public static int GetMonthIndex(this string month) {
        return Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                         t => t.Equals(month, StringComparison.CurrentCultureIgnoreCase));
    }
}

Mit Ausgabe:

False
True
True

Wenn Sie mit c # 3.0 (oder höher) können Sie Extender verwenden

ich es in C # -Code in spanischer Version übersetzen, Bezug:

public string ObtenerNumeroMes(string NombreMes){

       string NumeroMes;   

       switch(NombreMes) {

        case ("ENERO") :
            NumeroMes = "01";
            return NumeroMes;

        case ("FEBRERO") :
            NumeroMes = "02";
            return NumeroMes;

        case ("MARZO") :
            NumeroMes = "03";
            return NumeroMes;

        case ("ABRIL") :
            NumeroMes = "04";
            return NumeroMes;

        case ("MAYO") :
            NumeroMes = "05";
            return NumeroMes;

        case ("JUNIO") :
            NumeroMes = "06";
            return NumeroMes;

        case ("JULIO") :
            NumeroMes = "07";
            return NumeroMes;

        case ("AGOSTO") :
            NumeroMes = "08";
            return NumeroMes;

        case ("SEPTIEMBRE") :
            NumeroMes = "09";
            return NumeroMes;

        case ("OCTUBRE") :
            NumeroMes = "10";
            return NumeroMes;

        case ("NOVIEMBRE") :
            NumeroMes = "11";
            return NumeroMes;

        case ("DICIEMBRE") :
            NumeroMes = "12";
            return NumeroMes;

            default:
            Console.WriteLine("Error");
            return "ERROR";

        }

   }
Public Function returnMonthNumber(ByVal monthName As String) As Integer
    Select Case monthName.ToLower
        Case Is = "january"
            Return 1
        Case Is = "february"
            Return 2
        Case Is = "march"
            Return 3
        Case Is = "april"
            Return 4
        Case Is = "may"
            Return 5
        Case Is = "june"
            Return 6
        Case Is = "july"
            Return 7
        Case Is = "august"
            Return 8
        Case Is = "september"
            Return 9
        Case Is = "october"
            Return 10
        Case Is = "november"
            Return 11
        Case Is = "december"
            Return 12
        Case Else
            Return 0
    End Select
End Function

Vorsicht-Code ist in der Beta-Version.

Was ich tat, war Simple zu verwenden, um ein Format-String zu erstellen, und den Text zu einem Datum zu analysieren, und dann den Monat aus, dass abzuzurufen. Der Code ist unten:

int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top