Existe-t-il une énumération prédéfinie pour Month dans la bibliothèque .NET?

97

Je cherche à voir s'il existe une énumération officielle pendant des mois dans le framework .net.

Il me semble possible qu'il y en ait une, en raison de la fréquence d'utilisation du mois et du fait qu'il existe d'autres énumérations de ce type dans le framework .net.

Par exemple, il existe une énumération pour les jours de la semaine, System.DayOfWeek, qui comprend lundi, mardi, etc.

Je me demande s'il y en a un pour les mois de l'année, c'est-à-dire janvier, février, etc.

Est-ce que quelqu'un sait?

Mark Rogers
la source

Réponses:

118

Il n'y en a pas, mais si vous voulez le nom d'un mois, vous pouvez utiliser:

CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName (DateTime.Now.Month);

qui renverra une représentation sous forme de chaîne (du mois en cours, dans ce cas). Notez que GetMonthprend les arguments de 1 à 13 - janvier est 1, 13 est une chaîne vide.

Andy Mikula
la source
11
Ce n'est pas une énumération cependant.
Scott Wisniewski
3
Merci, réponse intéressante, pas ce que je cherchais, mais ça vaut quand même un +!
Mark Rogers
4
Je suis d'accord sur le problème spécifique à la culture, mais pourquoi Microsoft a-t-il alors créé DayOfWeek, c'est spécifique à la culture. C'est drôle, hein?
Mark Rogers
12
Peut-être parce que différentes cultures ont des calendriers mensuels différents, mais il n'y en a (apparemment) pas un qui a un nombre différent de jours par semaine. Ainsi, le nombre de jours par semaine est cohérent même si les noms ne le sont pas.
Ryan Lundy
11
Si vous êtes un programmeur de voyage dans le temps sensible à la culture, sachez qu'il y a eu des cultures qui avaient une semaine décimale (par exemple, la France révolutionnaire) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

Non, il n'y en a pas.

David Nelson
la source
3
Et quoi Microsoft.VisualBasic.MonthName?
Josh Stodola le
14
Quelle réponse utile vous avez fournie. Peut-être que des indications supplémentaires auraient été plus appropriées.
Michael Eakins
13
@ guillegr123 Comment suggéreriez-vous que je prouve un négatif?
David Nelson
7
Peut-être que cela ne prouve pas le négatif, mais un petit raisonnement ne serait pas hors de propos: il n'y a pas d'énumération car les énumérations ne peuvent pas être localisées. Mois: janvier n'aurait que peu ou pas de sens pour un programmeur russe. Ceci est en outre pris en charge en examinant les fonctions qui fournissent des noms de mois - elles sont situées sur un objet Culture.
Sam Axe
8
Un vote pour contrebalancer les 10 votes négatifs pour la seule réponse réelle à cette question. Existe-t-il une énumération officielle des mois dans .NET? Non, il n'y en a pas. Cela n'aurait pas de sens, car tous les calendriers n'ont pas le même nombre de mois, et c'est peut-être pour cela qu'il n'a jamais été introduit. Mais ce n'est pas le but ici. Est-ce qu'il y a un? Non. Réponse correcte à la question.
sm le
39

Je cherche à voir s'il existe une énumération officielle pendant des mois dans le framework .net.

Non.

Voici celui que j'ai préparé plus tôt. (Version C #)

public enum Month
{
    NotSet = 0,
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}
wal
la source
Pourquoi utiliser NotSet? Pourquoi ne pas commencer par January = 1? alors vous pourriez vous débarrasser du reste des missions aussi ..
Tersosauros
1
@Tersosauros car alors il sera par défaut Januarysi, par exemple, il est utilisé comme propriété pour une classe. dans la plupart des cas, je ne veux pas cela, je veux qu'il ait une valeur `` nulle '' avant qu'il ne soit explicitement attribué
wal
1
Mais @wal, si vous voulez une valeur 'null', vous devez utiliser votre enum comme nullable. Dans votre classe, utilisez le mois public? Mois {get; ensemble; }.
oteal
7
@Tersosauros notent que 0 sera toujours la valeur par défaut d'une énumération, même si elle n'est pas explicitement définie. Si NotSetest omis et January = 1(et le reste des valeurs sont 2, 3, etc.), la valeur par défaut de cette énumération serait(Month)0
tsemer
est venu poster la même chose .. cela devrait être la réponse. Enum peut être utilisé contre toutes les fonctions DateTime, c'est-à-dire DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(pas une énumération, mais je pense que l'instance CurrentInfo de DateTimeFormatInfo est ce que vous recherchez en général). Si vous voulez une liste déroulante, vous pouvez la construire comme ceci:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });
Doug Lampe
la source
1
return Enumerable.Range (0, 11) .Select (m => new {Id = month + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [month]});
Keith Harrison
var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Dan Diplo
13

Un trouvé dans l'énumération "MonthNamesType" de cet espace de noms: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

L'emplacement fait un peu peur mais c'est quand même là.

vidalsasoon
la source
Je vous attribuerais la bonne réponse, mais je ne pense pas que cela fasse partie du framework .net de la bibliothèque de base. +1 pour l'effort et la créativité.
Mark Rogers
semble faire partie de .net 3.5. Ouvrez simplement la visionneuse d'objets dans Visual Studio et recherchez «Janvier» et les correspondances dans l'API apparaissent.
vidalsasoon
Oui, j'ai fait ce que vous avez suggéré, il semble que ce soit dans le dossier v3.0, et ce n'est pas une bibliothèque par défaut. Donc, même si je suppose que c'est dans la bibliothèque, son emplacement est loin d'être idéal. C'est dans une certaine zone grise en ce qui concerne les exigences de la question.
Mark Rogers
+1 serait pour l'effort à coup sûr. De quoi parlons-nous ici?
indolentdeveloper
10

Qu'essayez-vous d'accomplir exactement?

si tout ce que vous voulez, ce sont douze chaînes avec les mois de l'année indiqués, alors cela est disponible via une chaîne de format personnalisée - appliquée pour toute instance d'une date / heure,

  DateTime dt = DateTime.Parse("12 January 2009";
   dt.ToString("MMM");  // prints "Jan" 
                        // (or the right abbrev is in current culture)
   dt.ToString("MMMM"); // prints "January" 
                        // (or correct sp in current culture)

si vous souhaitez simplement pouvoir spécifier le mois en tant que propriété énumérée d'un autre type d'objet, la propriété Month d'un champ DateTime renvoie un entier de 1 à 12 ...

Charles Bretana
la source
1
Merci pour votre réponse, je suis juste curieux de savoir s'il y a une énumération officielle, car je suis sur le point d'en créer une et j'aimerais juste savoir s'il y en a une qui existe déjà, donc je ne redéfinis pas une énumération inutile .
Mark Rogers
1
Non afaik, il n'y en a pas, (Si vous en créez un, je rendrais les valeurs entières explicites, si vous pouvez vous assurer qu'elles sont les mêmes que les valeurs 1-12 utilisées par .Net pour représenter monthNumbers)
Charles Bretana
3

Oui, il y en a certainement. Il fait partie de l'espace de noms Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

Et pour ceux d'entre vous qui ont un problème avec cet espace de noms, vous devez comprendre qu'il s'agit vraiment de .NET et qu'il ne mène nulle part .

Pour mémoire, la MonthNamefonction appelle en interne ce qui suit ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
la source
1
Désolé mais cette réponse pose le même problème que la réponse précédente, en ce que ce n'est pas une énumération, qui est le sujet de cette question. Encore merci pour l'info.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames est une chaîne [] qui est IEnumerable.
user169771
1
@ user169771 - string [] est un IEnumerablemais ce n'est pas une enumaération. Donc ça ne marche pas.
Mark Rogers
2

Certains calendriers ont en effet plus de 12 mois: http://en.wikipedia.org/wiki/Month mais je ne peux pas dire si c'est la raison pour laquelle MS n'a pas construit d'énumération en .NET.

Pour les paresseux comme moi qui auraient aimé un copier / coller, en VB:

Public Enum MonthsOfYear
    January = 1
    February = 2
    March = 3
    April = 4
    May = 5
    June = 6
    July = 7
    August = 8
    September = 9
    October = 10
    November = 11
    December = 12
End Enum
François Gagnon
la source
1

Je ne sais pas avec certitude, mais mon intuition est non. DateTime.Month renvoie un entier. S'il y avait une telle énumération, elle serait probablement retournée par DateTime.

Scott Wisniewski
la source
1

Je chercherais quelque chose comme ça pour coder avec, comme

        if (DateTime.Now.Month != 1) // can't run this test in January.

contient ce nombre magique de 1. tandis que

        if (DateTime.Now.Month != DateTime.MonthsOfYear.January) 

est auto-documenté

Jadawin
la source
0

Une énumération serait plutôt utile, mais vous pouvez obtenir le résultat souhaité avec un format:

DateTime myDateTimeObject=DateTime.Now; //(for example)
string monthName = myDateTimeObject.ToString("MMMM");

Cela renvoie le nom complet du mois (janvier, février, etc.). À utiliser myDateTimeObject.ToString("MMM")pour un nom court (janvier, février, mars, etc.).

Si vous avez un numéro de mois particulier mnthNum, sans aucun DateTime, vous pouvez toujours utiliser quelque chose comme ceci:

string monthName=(new DateTime(2000,mnthNum,1)).ToString("MMMM");

ou

string monthName=((new DateTime(2000,1,1)).AddMonths(mnthNum-1)ToString("MMMM");

Mais cela semble un peu compliqué. Le premier exemple exige que se mnthNumsitue entre 1 et 12. Le deuxième exemple autorise (presque) n'importe quel numéro de mois et n'est pas limité à 1 à 12.

Keith
la source