Czy istnieje wstępnie zdefiniowane wyliczenie miesiąca w bibliotece .NET?

97

Chcę sprawdzić, czy w ramach .net istnieje oficjalne wyliczenie od miesięcy.

Wydaje mi się, że jest możliwe, ze względu na to, jak powszechne jest użycie miesiąca i ponieważ istnieją inne tego typu wyliczenia w ramach .net.

Na przykład istnieje wyliczenie dni w tygodniu System.DayOfWeek, które obejmują poniedziałek, wtorek itd.

Zastanawiam się, czy jest taki dla miesięcy w roku, czyli stycznia, lutego itd.?

Czy ktoś wie?

Mark Rogers
źródło

Odpowiedzi:

118

Nie ma, ale jeśli chcesz nazwę miesiąca, możesz użyć:

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

co zwróci ciąg znaków reprezentujący (w tym przypadku bieżący miesiąc). Zauważ, że GetMonthprzyjmuje argumenty od 1 do 13 - styczeń to 1, 13 to pusty ciąg.

Andy Mikula
źródło
11
To jednak nie jest wyliczenie.
Scott Wisniewski
3
Dzięki, ciekawa odpowiedź, nie to, czego szukałem, ale nadal warte +!
Mark Rogers
4
Zgadzam się z kwestią związaną z kulturą, ale dlaczego firma Microsoft stworzyła DayOfWeek, jest to specyficzne dla kultury. Zabawne, co?
Mark Rogers
12
Być może dlatego, że różne kultury mają różne kalendarze miesięczne, ale nie ma (najwyraźniej) takiego, który ma inną liczbę dni w tygodniu. Tak więc liczba dni w tygodniu jest spójna, nawet jeśli nazwy nie są.
Ryan Lundy
11
Jeśli jesteś wrażliwym kulturowo programistą podróżującym w czasie, pamiętaj, że istniały kultury, które miały tydzień dziesiętny (np. Rewolucyjna Francja) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

Nie, nie ma.

David Nelson
źródło
3
O co chodzi Microsoft.VisualBasic.MonthName?
Josh Stodola
14
Cóż za użyteczna odpowiedź. Być może jakieś dodatkowe wskazówki byłyby bardziej odpowiednie.
Michael Eakins
13
@ guillegr123 Jak byś zasugerował, abym udowodnił, że jest negatywny?
David Nelson,
7
Być może nie dowodzi tego, że jest to negatywne, ale małe rozumowanie nie byłoby nie w porządku: nie ma wyliczenia, ponieważ nie można zlokalizować wyliczeń. Miesiące Styczeń nie miałby żadnego znaczenia dla rosyjskiego programisty. Jest to dodatkowo wspierane przez przyjrzenie się funkcjom, które zapewniają nazwy miesięcy - znajdują się one w obiekcie kultury.
Sam Axe
8
Głosowanie za przeciwnikiem 10 głosów przeciw za jedyną rzeczywistą odpowiedź na to pytanie. Czy istnieje oficjalne wyliczenie miesięcy w .NET? Nie, nie ma. Miałoby to mało sensu, ponieważ nie każdy kalendarz ma taką samą liczbę miesięcy i może dlatego nigdy nie został wprowadzony. Ale nie o to tutaj chodzi. Czy jest jeden? Nie. Pytanie odpowiedział poprawnie.
sm
39

Chcę sprawdzić, czy w ramach .net istnieje oficjalne wyliczenie od miesięcy.

Nie.

Oto jeden, który przygotowałem wcześniej. (Wersja 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
źródło
Dlaczego używać NotSet? Dlaczego nie po prostu zacząć January = 1? wtedy możesz pozbyć się także reszty zadań ...
Tersosauros
1
@Tersosauros, ponieważ wtedy domyślnie będzie, Januaryjeśli, na przykład, jest używany jako właściwość dla klasy. w większości przypadków nie chcę tego, chcę, aby miał wartość
wal
1
Ale @wal, jeśli chcesz mieć wartość „null”, powinieneś użyć swojego wyliczenia jako wartości null. W swojej klasie użyj miesiąca publicznego? Miesiąc {get; zestaw; }.
uwaga
7
@Tersosauros zauważ, że 0 zawsze będzie wartością domyślną wyliczenia, nawet jeśli nie jest wyraźnie zdefiniowane. Jeśli NotSetzostanie pominięty i January = 1(a pozostałe wartości to 2, 3 itd.), To domyślną wartością tego wyliczenia będzie(Month)0
tsemer
przyszedłem opublikować to samo ... to powinna być odpowiedź. Enum może być używany ze wszystkimi funkcjami DateTime, tj. DateTime.Now.Month == (int) Month.J January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(nie wyliczenie, ale myślę, że wystąpienie CurrentInfo DateTimeFormatInfo jest tym, czego szukasz w ogóle). Jeśli chcesz listę rozwijaną, możesz ją zbudować w następujący sposób:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });
Doug Lampe
źródło
1
return Enumerable.Range (0, 11) .Select (m => nowy {Id = miesiąc + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [miesiąc]});
Keith Harrison
var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Dan Diplo
13

Znaleziono jeden w wyliczeniu „MonthNamesType” tej przestrzeni nazw: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Lokalizacja trochę przeraża, ale mimo to istnieje.

vidalsasoon
źródło
Chciałbym przyznać ci poprawną odpowiedź, ale nie sądzę, że jest to część struktury .net biblioteki podstawowej. +1 za wysiłek i kreatywność.
Mark Rogers
wygląda na to, że jest częścią .net 3.5. Po prostu otwórz przeglądarkę obiektów w programie Visual Studio i wyszukaj „styczeń”, a pojawią się dopasowania w interfejsie API.
vidalsasoon
Tak, zrobiłem tak, jak sugerowałeś, wygląda na to, że znajduje się w folderze v3.0 i nie jest to domyślna biblioteka. Więc chociaż myślę, że jest w bibliotece, to lokalizacja jest mniej niż idealna. Jest to coś w rodzaju szarej strefy, jeśli chodzi o wymagania tego pytania.
Mark Rogers
+1 z pewnością byłby wysiłkiem. O jakim dll mówimy tutaj?
indolentdeveloper
10

Co dokładnie próbujesz osiągnąć?

jeśli chcesz mieć tylko dwanaście ciągów z wypisanymi miesiącami roku, to jest to dostępne za pośrednictwem niestandardowego ciągu formatu - stosowanego dla dowolnego wystąpienia daty i godziny,

  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)

jeśli chcesz tylko móc określić miesiąc jako wyliczoną właściwość innego typu obiektu, właściwość Month pola DateTime zwraca liczbę całkowitą od 1 do 12 ...

Charles Bretana
źródło
1
Dziękuję za odpowiedź, jestem po prostu ciekawy, czy istnieje oficjalne wyliczenie, ponieważ za chwilę je utworzę i chciałbym tylko wiedzieć, czy istnieje już takie, więc nie redefiniuję niepotrzebnego wyliczenia .
Mark Rogers
1
Brak afaik, nie ma żadnego (jeśli utworzysz jeden, określiłbym wartości całkowite jawnie, więc możesz upewnić się, że są takie same jak wartości 1-12 używane przez .Net do reprezentowania numerów miesięcy)
Charles Bretana
3

Tak, na pewno jest. Jest częścią przestrzeni nazw Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

A ci z was, którzy mają problem z tą przestrzenią nazw, powinni zrozumieć, że to naprawdę jest .NET i nigdzie się nie wybiera .

Dla przypomnienia, MonthNamefunkcja wewnętrznie wywołuje następujący ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
źródło
1
Przepraszam, ale ta odpowiedź ma ten sam problem co poprzednia odpowiedź, ponieważ nie jest to wyliczenie, które jest tematem tego pytania. Mimo to dziękuję za informację.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames to ciąg znaków [], który jest IEnumerable.
user169771
1
@ user169771 - string [] jest poprawką, IEnumerableale nie jest enumpoprawką. Więc to nie działa.
Mark Rogers
2

Niektóre kalendarze rzeczywiście mają więcej niż 12 miesięcy: http://en.wikipedia.org/wiki/Month, ale nie mogę powiedzieć, czy to był powód, dla którego MS nie zbudowało wyliczenia w .NET.

Dla leniwych jak ja, którzy chcieliby kopiować / wklejać w 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
źródło
1

Nie wiem na pewno, ale mam przeczucie. DateTime.Month zwraca liczbę całkowitą. Gdyby istniało takie wyliczenie, prawdopodobnie zostałoby zwrócone przez DateTime.

Scott Wiśniewski
źródło
1

Szukałbym czegoś takiego do kodowania, jak

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

ma w sobie tę magiczną liczbę 1. natomiast

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

dokumentuje się samoczynnie

Jadawin
źródło
0

Wyliczenie byłoby raczej przydatne, ale można uzyskać pożądany wynik za pomocą formatu:

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

Zwraca pełną nazwę miesiąca (styczeń, luty itp.). Użyj myDateTimeObject.ToString("MMM")krótkiej nazwy (styczeń, luty, marzec itp.).

Jeśli masz określony numer miesiąca mnthNum, bez żadnego DateTime, zawsze możesz użyć czegoś takiego:

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

lub

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

Ale to wydaje się trochę niechlujne. Pierwszy przykład wymaga mnthNumod 1 do 12. Drugi przykład dopuszcza (prawie) dowolny numer miesiąca i nie jest ograniczony do 1 do 12.

Keith
źródło