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?
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).
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();
Vous pouvez utiliser ce qui suit pour retourner un tableau de chaînes contenant les noms de mois
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
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]);
}
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!
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.
public IEnumerable<SelectListItem> Months
{
get
{
return Enumerable.Range(1, 12).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
});
}
}
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.
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.
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!
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);
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;
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;
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.
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 ....