En ce moment je crée un DateTime
pour chaque mois et le formater pour n'inclure que le mois.
Existe-t-il une autre ou une meilleure façon de procéder?Comment lister tous les noms de mois, par ex. pour un combo?
Répondre
Vous pouvez utiliser le 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 créer un nouveau DateTimeFormatInfo
ba sed sur un CultureInfo
avec DateTimeFormatInfo.GetInstance
ou vous pouvez utiliser la propriété CultureInfo.DateTimeFormat
de la culture actuelle. Gardez à l'esprit que les calendriers en .Net supportent jusqu'à 13 mois, donc vous obtiendrez une chaîne vide supplémentaire à la fin pour les calendriers avec seulement 12 mois (comme ceux trouvés en en-US ou en fr par exemple).
Vous pouvez utiliser les éléments suivants pour retourner un tableau de chaîne contenant les noms de mois
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
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);
}
Il pourrait y avoir un certain problème avec le nombre de mois dans une année en fonction du type de calendrier, mais je viens pris 12 mois dans cet exemple.
Pour une raison quelconque, le code que j'ai saisi utilisait le nom Invariant pour la propriété ListItem.Value. Vous ne savez pas pourquoi, mais vous pourriez vouloir utiliser un nombre entier pour cela. – Greg
Essayez les noms de l'énumération mois:
for(int i = 1; i <= 12; i++){
combo.Items.Add(CultureInfo.CurrentCulture.DateTimeFormat.MonthNames[i]);
}
Il est dans l'espace de noms System.Globalization.
Espérons que ça aide!
J'utilise CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName –
Ils sont définis en tant que tableau dans les espaces de noms de globalisation.
using System.Globalization;
for (int i = 0; i < 12; i++) {
Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);
}
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;
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, le code de golf LINQ!
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();
Comme l'utilisation de Enumerable.Range, je vais l'utiliser avec une liste de MVC SelectListItems – John
public IEnumerable<SelectListItem> Months
{
get
{
return Enumerable.Range(1, 12).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
});
}
}
Une façon de récupérer une culture dynamique liste spécifique des noms de mois à C# avec LINQ.
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é par mois 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 une vide le 13ème mois.
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: Do noter que pour les différentes cultures locales /, la sortie pourrait ne pas être en anglais. Je n'ai pas testé cela avant.
Pour anglais uniquement:
string[] monthNames = (new System.Globalization.CultureInfo("en-US")).DateTimeFormat.MonthNames;
Voici un bon exemple pour remplir une liste déroulante avec des mois pour le formulaire de 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 ce qui suit localisé dans la langue actuelle, par exemple :
01 - January
02 - February
etc.
Un petit LINQ juste parce qu'il 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 du 13ème mois (vide en anglais). L'index renvoie l'index dans IEnumerable, vous avez donc besoin d'un +1 pour l'index du mois actuel.
Votre deuxième exemple ne sera pas compilé. Vous devez créer une nouvelle instance de 'DateTimeFormatInfo' ou appeler sa méthode' GetInstance() 'à partir de la classe statique .e.g. 'new DateTimeFormatInfo(). MonthNames;' ou 'DateTimeFormatInfo.GetInstance(). MonthNames' –
J'ai corrigé les problèmes signalés par les commentaires (à l'avenir, vous pouvez simplement modifier la publication). – user7116