Question

Je dois pouvoir comparer certains noms de mois que j'ai dans un tableau.

Ce serait bien s'il y avait un moyen direct comme:

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

Ma recherche sur Google semble suggérer que le seul moyen est d'écrire votre propre méthode, mais cela semble être un problème assez commun pour que je pense qu'elle aurait déjà été implémentée dans .Net. Quelqu'un l'a déjà fait auparavant?

Était-ce utile?

La solution

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

Bien que, pour vos besoins, vous feriez mieux de créer simplement un Dictionary<string, int> mappage du nom du mois sur sa valeur.

Autres conseils

Vous pouvez faire quelque chose comme ceci:

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

Si vous utilisez la méthode DateTime.ParseExact() - suggérée par plusieurs personnes, vous devez évaluer avec soin ce que vous voulez qu'il se passe lorsque l'application s'exécute dans un environnement autre que l'anglais!

Au Danemark, lequel de ParseExact("Januar", ...) et ParseExact("January", ...) devrait fonctionner et lequel devrait échouer?

Ce sera la différence entre CultureInfo.CurrentCulture et CultureInfo.InvariantCulture.

Vous pouvez utiliser la méthode DateTime.Parse pour obtenir un objet DateTime, puis vérifier sa propriété Month. Faites quelque chose comme ça:

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

L'astuce consiste à créer une date valide pour créer un objet DateTime.

Vous pouvez utiliser une énumération de mois:

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

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

Je ne suis cependant pas sûr à 100% de la syntaxe de enum.Parse ().

Il n'est pas nécessaire de créer une instance DateTime pour cela. C'est aussi simple que cela:

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

J'utilise la da-DK culture pour que ce test unitaire réussisse:

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

Je laisserai au lecteur le soin de créer une surcharge dans laquelle vous pourrez transmettre un CultureInfo explicite.

Une solution simple serait de créer un dictionnaire avec des noms et des valeurs. Ensuite, en utilisant Contains (), vous pouvez trouver la bonne valeur.

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

Et répondant à cette question sept ans après que la question a été posée, il est possible de faire cette comparaison en utilisant des méthodes intégrées:

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

devient

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

Ce qui peut être refactored dans une méthode d’extension pour plus de simplicité. Voici un exemple LINQPad (d'où les Dump() appels de méthode):

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

Avec la sortie:

False
True
True

Si vous utilisez la version 3.0 (ou supérieure), vous pouvez utiliser des extensions.

Je le traduis en code C # en version espagnole, en ce qui concerne:

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

le code de précaution est en version bêta.

Ce que j'ai fait est d'utiliser SimpleDateFormat pour créer une chaîne de format, puis analyser le texte avec une date, puis extraire le mois de cette date. Le code est ci-dessous:

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top