Gibt es eine vordefinierte Aufzählung für Monat in der .NET-Bibliothek?

97

Ich bin gespannt, ob es im .net-Framework seit Monaten eine offizielle Aufzählung gibt.

Es scheint mir möglich zu sein, dass es eine gibt, weil der Monat häufig verwendet wird und weil es im .net-Framework andere solche Aufzählungen gibt.

Zum Beispiel gibt es eine Aufzählung für die Wochentage, System.DayOfWeek, die Montag, Dienstag usw. Enthält.

Ich frage mich, ob es einen für die Monate im Jahr gibt, dh Januar, Februar usw.?

Weiß jemand?

Mark Rogers
quelle

Antworten:

118

Es gibt keine, aber wenn Sie den Namen eines Monats möchten, können Sie verwenden:

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

Dies gibt eine Zeichenfolgendarstellung zurück (in diesem Fall des aktuellen Monats). Beachten Sie, dass GetMonthArgumente von 1 bis 13 verwendet werden - Januar ist 1, 13 ist eine leere Zeichenfolge.

Andy Mikula
quelle
11
Das ist aber keine Aufzählung.
Scott Wisniewski
3
Danke, interessante Antwort, nicht das, wonach ich gesucht habe, aber trotzdem ein + wert!
Mark Rogers
4
Ich stimme dem kulturspezifischen Problem zu, aber warum hat Microsoft dann DayOfWeek erstellt, das kulturspezifisch ist? Komisch, oder?
Mark Rogers
12
Vielleicht, weil verschiedene Kulturen unterschiedliche Monatskalender haben, aber es gibt (anscheinend) keinen, der eine unterschiedliche Anzahl von Tagen pro Woche hat. Die Anzahl der Tage pro Woche ist also konsistent, auch wenn die Namen nicht übereinstimmen .
Ryan Lundy
11
Wenn Sie ein kulturell sensibler, zeitreisender Programmierer sind, beachten Sie, dass es Kulturen gab, die eine Dezimalwoche hatten (z. B. das revolutionäre Frankreich). En.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

Nein, gibt es nicht.

David Nelson
quelle
3
Was ist mit Microsoft.VisualBasic.MonthName?
Josh Stodola
14
Was für eine nützliche Antwort, die Sie gegeben haben. Vielleicht wäre eine zusätzliche Anleitung angemessener gewesen.
Michael Eakins
13
@ guillegr123 Wie würden Sie vorschlagen, dass ich ein Negativ beweise?
David Nelson
7
Vielleicht beweist es nicht das Negative, aber ein wenig Argumentation wäre nicht unpassend: Es gibt keine Aufzählung, weil Aufzählungen nicht lokalisiert werden können. Monate. Januar hätte für einen russischen Programmierer wenig oder gar keine Bedeutung. Dies wird weiter unterstützt, indem Sie sich die Funktionen ansehen, die Monatsnamen bereitstellen - sie befinden sich auf einem Kulturobjekt.
Sam Axe
8
Upvoting, um den 10 Downvotes für die einzig tatsächliche Antwort auf diese Frage entgegenzuwirken. Gibt es eine offizielle Aufzählung für Monate in .NET? Nein, gibt es nicht. Es wäre wenig sinnvoll, da nicht jeder Kalender die gleiche Anzahl von Monaten hat, und vielleicht wurde er deshalb nie eingeführt. Aber darum geht es hier nicht. Ist dort eines? Frage richtig beantwortet.
sm
39

Ich bin gespannt, ob es im .net-Framework seit Monaten eine offizielle Aufzählung gibt.

Nein.

Hier ist eine, die ich zuvor vorbereitet habe. (C # Version)

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
quelle
Warum verwenden NotSet? Warum nicht einfach anfangen January = 1? dann könnten Sie auch den Rest der Aufgaben
abschaffen
1
@Tersosauros, da dann standardmäßig verwendet wird, Januarywenn es beispielsweise als Eigenschaft für eine Klasse verwendet wird. in den meisten Fällen nicht wollen , ich , dass ich es eine ‚Null‘ Wert haben soll , bevor er ausdrücklich zugewiesen ist
wal
1
Aber @wal, wenn Sie den Wert 'null' möchten, sollten Sie Ihre Aufzählung als nullwert verwenden. Verwenden Sie in Ihrer Klasse den öffentlichen Monat? Monat {get; einstellen; }.
oteal
7
@Tersosauros beachten Sie, dass 0 immer der Standardwert einer Aufzählung ist, auch wenn er nicht explizit definiert ist. Wenn NotSetweggelassen wird und January = 1(und der Rest der Werte 2, 3 usw. ist), wäre der Standardwert dieser Aufzählung(Month)0
tsemer
kam, um das gleiche zu posten .. das sollte die Antwort sein. Die Aufzählung kann für alle DateTime-Funktionen verwendet werden, dh DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(Keine Aufzählung, aber ich denke, dass die CurrentInfo-Instanz von DateTimeFormatInfo das ist, wonach Sie im Allgemeinen suchen). Wenn Sie eine Dropdown-Liste möchten, können Sie diese folgendermaßen erstellen:

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

Es wurde eine in der Aufzählung "MonthNamesType" dieses Namespace gefunden: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Die Lage ist ein bisschen beängstigend, aber es ist trotzdem da.

vidalsasoon
quelle
Ich würde Ihnen die richtige Antwort geben, aber ich denke nicht, dass dies Teil des .net-Frameworks der Basisbibliothek ist. +1 für Mühe und Kreativität.
Mark Rogers
scheint ein Teil von .net 3.5 zu sein. Öffnen Sie einfach den Objekt-Viewer in Visual Studio und suchen Sie nach "Januar". Die Übereinstimmungen in der API werden angezeigt.
Vidalsasoon
Ja, ich habe getan, was Sie vorgeschlagen haben. Es sieht so aus, als ob es sich im Ordner v3.0 befindet, und es ist keine Standardbibliothek. Also, während ich denke, es ist in der Bibliothek, ist seine Lage nicht ideal. Was die Anforderungen der Frage betrifft, befindet es sich in einer Art Grauzone.
Mark Rogers
+1 wäre sicher für Mühe. Worüber reden wir hier?
Indolentdeveloper
10

Was genau versuchst du zu erreichen?

Wenn Sie nur zwölf Zeichenfolgen mit den angegebenen Monaten des Jahres wünschen, ist dies über eine benutzerdefinierte Formatzeichenfolge verfügbar, die für jede Instanz einer Datums- / Uhrzeitangabe angewendet wird.

  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)

Wenn Sie den Monat nur als Aufzählungseigenschaft eines anderen Objekttyps angeben möchten, gibt die Month-Eigenschaft eines DateTime-Felds eine Ganzzahl von 1 bis 12 zurück.

Charles Bretana
quelle
1
Vielen Dank für Ihre Antwort. Ich bin nur neugierig, ob es eine offizielle Aufzählung gibt, da ich im Begriff bin, eine zu erstellen, und ich möchte nur wissen, ob es bereits eine gibt, damit ich eine nicht benötigte Aufzählung nicht neu definiere .
Mark Rogers
1
Nein afaik, es gibt keine (Wenn Sie einen erstellen, würde ich die ganzzahligen Werte explizit machen, damit Sie sicherstellen können, dass sie mit den 1-12-Werten übereinstimmen, die von .Net zur Darstellung von monthNumbers verwendet werden)
Charles Bretana
3

Ja, das gibt es sicherlich. Es ist Teil des Microsoft.VisualBasic-Namespace ...

Microsoft.VisualBasic.MonthName

Und für diejenigen unter Ihnen, die ein Problem mit diesem Namespace haben, sollten Sie verstehen, dass es sich wirklich um .NET handelt und es nirgendwohin geht .

Für die Aufzeichnung MonthNameruft die Funktion intern Folgendes auf ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
quelle
1
Entschuldigung, aber diese Antwort hat das gleiche Problem wie die vorherige Antwort, da es sich nicht um eine Aufzählung handelt, die das Thema dieser Frage ist. Trotzdem danke für die Info.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames ist eine Zeichenfolge [], die IEnumerable ist.
user169771
1
@ user169771 - string [] ist eine, IEnumerableaber keine enumEration. Also funktioniert es nicht.
Mark Rogers
2

Einige Kalender haben in der Tat mehr als 12 Monate: http://en.wikipedia.org/wiki/Month, aber ich kann nicht sagen, ob dies der Grund war, warum MS keine Aufzählung in .NET erstellt hat.

Für die Faulen wie mich, die gerne kopiert / eingefügt hätten, in 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
Francois Gagnon
quelle
1

Ich weiß es nicht genau, aber meine Vermutung ist nein. DateTime.Month gibt eine Ganzzahl zurück. Wenn es eine solche Aufzählung gäbe, würde sie wahrscheinlich von DateTime zurückgegeben.

Scott Wisniewski
quelle
1

Ich würde nach so etwas suchen, mit dem ich programmieren kann

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

hat diese magische Zahl von 1 drin. wohingegen

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

ist selbstdokumentierend

Jadawin
quelle
0

Eine Aufzählung wäre ziemlich nützlich, aber Sie können das gewünschte Ergebnis mit einem Format erhalten:

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

Dies gibt den vollständigen Monatsnamen (Januar, Februar usw.) zurück. Verwendung myDateTimeObject.ToString("MMM")für Kurznamen (Jan, Feb, Mar usw.).

Wenn Sie eine bestimmte Monatszahl mnthNumohne eine haben DateTime, können Sie immer Folgendes verwenden:

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

oder

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

Aber das scheint ein bisschen chaotisch. Das erste Beispiel erfordert einen Wert mnthNumzwischen 1 und 12. Das zweite Beispiel erlaubt (fast) jede Monatszahl und ist nicht auf 1 bis 12 beschränkt.

Keith
quelle