web-dev-qa-db-fra.com

Comment lister tous les noms de mois, par exemple pour un combo?

Pour le moment, je crée une DateTime pour chaque mois et le formate pour n'inclure que le mois.
Y a-t-il un autre moyen ou un meilleur moyen de le faire?

63
ProfK

Vous pouvez utiliser la DateTimeFormatInfo pour obtenir cette information:

// Will return January
string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1);

ou pour obtenir tous les noms:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

Vous pouvez également instancier une nouvelle DateTimeFormatInfo basée sur CultureInfo avec DateTimeFormatInfo.GetInstance ou vous pouvez utiliser la propriété CultureInfo.DateTimeFormat de la culture actuelle.

var dateFormatInfo = CultureInfo.GetCultureInfo("en-GB").DateTimeFormat;

N'oubliez pas que les calendriers dans .Net prennent en charge jusqu'à 13 mois. Vous obtiendrez ainsi une chaîne vide supplémentaire à la fin des calendriers avec seulement 12 mois (comme ceux trouvés en en-US ou fr par exemple).

144
Yona

Cette méthode vous permettra d’appliquer une liste de paires de valeurs clés de mois à leurs homologues int. Nous le générons avec une seule ligne en utilisant Enumerable Ranges et LINQ. Hourra, LINQ code-golf!

var months = Enumerable.Range(1, 12).Select(i => new { I = i, M = DateTimeFormatInfo.CurrentInfo.GetMonthName(i) });

Pour l'appliquer à une liste déroulante ASP:

// <asp:DropDownList runat="server" ID="ddlMonths" />
ddlMonths.DataSource = months;
ddlMonths.DataTextField = "M";
ddlMonths.DataValueField = "I";
ddlMonths.DataBind();
25
mmmeff

Vous pouvez utiliser ce qui suit pour retourner un tableau de chaînes contenant les noms de mois

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
19
Rohan West

Ils sont définis comme un tableau dans les espaces de noms Globalization.

using System.Globalization;

for (int i = 0; i < 12; i++) {
   Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);
}
12
Dylan Beattie

Essayez d'énumérer les noms de mois:

for( int i = 1; i <= 12; i++ ){
  combo.Items.Add(CultureInfo.CurrentCulture.DateTimeFormat.MonthNames[i]);
}

C'est dans l'espace de noms System.Globalization.

J'espère que cela pourra aider!

5
Zachary Yates

Vous pouvez obtenir une liste des mois localisés à partir de Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames et des mois invariants à partir de DateTimeFormatInfo.InvariantInfo.MonthNames.

string[] localizedMonths = Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames;
string[] invariantMonths = DateTimeFormatInfo.InvariantInfo.MonthNames;

for( int month = 0; month < 12; month++ )
{
    ListItem monthListItem = new ListItem( localizedMonths[month], invariantMonths[month] );
    monthsDropDown.Items.Add( monthListItem );
}

Le nombre de mois dans une année peut être problématique en fonction du type de calendrier, mais je suppose seulement 12 mois dans cet exemple.

4
Greg
public IEnumerable<SelectListItem> Months
{
  get
  {
    return Enumerable.Range(1, 12).Select(x => new SelectListItem
    {
      Value = x.ToString(),
      Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
    });
  }
}
3
WebDev07

Un moyen de récupérer une culture dynamique liste spécifique de noms de mois dans C # withLINQ.

ComboBoxName.ItemsSource= 
System.Globalization.CultureInfo.
CurrentCulture.DateTimeFormat.MonthNames.
TakeWhile(m => m != String.Empty).ToList();

OU

Dans cet exemple, un objet anonyme est créé avec une propriété Month et MonthName.

var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
 .TakeWhile(m => m != String.Empty)
 .Select((m,i) => new  
 {  
     Month = i+1,  
     MonthName = m
 }) 
 .ToList();

PS: Nous utilisons la méthode TakeWhile car le tableau MonthNames contient un treizième mois vide. 

3
Maher Ben Issa

Un peu de LINQ juste parce que c'est magnifiquement concis:

var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames
    .Where(p=>!string.IsNullOrEmpty(p))
    .Select((item, index) => new { Id = index + 1, Name = item });

Vous avez besoin de la clause Where car le calendrier renvoie un nom de 13ème mois (vide en anglais).

L'index renvoie l'index dans IEnumerable, vous avez donc besoin d'un +1 pour l'index de mois réel.

3
DivineOps

Bien sûr, je vais répondre à une question de plus de 10 ans.

Dans mon cas, je crée une propriété qui renvoie un dictionnaire (ou similaire), généré avec le code suivant: 

Dictionary<int, string> Months = Enumerable.Range(1, 12).Select(i => new KeyValuePair<int, string>(i, System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i))).ToDictionary(x => x.Key, x => x.Value);

Sortie (de Linqpad):

Key Value
1   January
2   February
3   March
4   April
5   May
6   June
7   July
8   August
9   September
10  October
11  November
12  December

J'espère que quelqu'un trouve cela utile!

1
SeanH

Je l'ai fait de la manière suivante: (il est possible de définir la culture)

var months = Enumerable.Range(1, 12).Select(i => 
    new
    {
        Index = i,
        MonthName = new CultureInfo("en-US").DateTimeFormat.GetAbbreviatedMonthName(i)
    })
    .ToDictionary(x => x.Index, x => x.MonthName);
1
Tiago Ávila
string[] monthNames = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;

foreach (string m in monthNames) // writing out
{
    Console.WriteLine(m);
}

Sortie:

January
February
March
April
May
June
July
August
September
October
November
December

Mise à jour: Notez que pour différentes régions/cultures, la sortie peut ne pas être en anglais. Je n'ai pas testé cela auparavant.

Pour l'anglais américain uniquement: 

string[] monthNames = (new System.Globalization.CultureInfo("en-US")).DateTimeFormat.MonthNames;
0
Nayeem Mansoori
List<string> mnt = new List<string>();    
int monthCount = Convert.ToInt32(cbYear.Text) == DateTime.Now.Year ? DateTime.Now.Month : 12;    
            for (int i = 0; i < monthCount; i++)    
            {    
                mnt.Add(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);    
            }    
            cbMonth.DataSource = mnt;
0
Jeevan Moses

Voici un bon exemple pour remplir une liste déroulante avec le formulaire Mois pour carte de crédit:

    Dim currentCulture As CultureInfo = CultureInfo.CurrentUICulture
    Dim monthName, monthNumber As String

    For x As Integer = 0 To 11
        monthNumber = (x + 1).ToString("D2")
        monthName = currentCulture.DateTimeFormat.MonthNames(x)
        Dim month As New ListItem(String.Format("{0} - {1}", monthNumber, monthName),
                                  x.ToString("D2"))
        ddl_expirymonth.Items.Add(month)
    Next

Crée le suivant dans la langue actuelle, par exemple:

01 - January
02 - February
etc.
0

Comment créer une liste personnalisée de noms de mois dans n'importe quel ordre

Oui, je réponds à une question d'il y a plus de 10 ans! :RÉ

Pourtant, je voulais ajouter cet extrait de code pour pouvoir aider les autres. Il montre comment générer une liste de noms de mois dans un ordre personnalisé. Dans mon cas, j’avais besoin que cela commence en octobre, mais vous pouvez mettre les mois dans n’importe quelle séquence (même les mois qui se répètent) en définissant la liste des entiers. 

model.Controls = new
{
    FiscalMonths = new
    {
        Value = DateTime.Now.Month,
        Options = (new List<int> { 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9 }).Select(p => new
        {
            Value = p,
            Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(p)
        })
    }
};

Et la sortie JSON à utiliser dans une liste déroulante:

  "FiscalMonths": {
   "Value": 10,
   "Options": [
    {
     "Value": 10,
     "Text": "October"
    },
    {
     "Value": 11,
     "Text": "November"
    },
    {
     "Value": 12,
     "Text": "December"
    },
    {
     "Value": 1,
     "Text": "January"
    },
    {
     "Value": 2,
     "Text": "February"
    },
    etc ....
0
Roberto