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?

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.


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.


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
}

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 });

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.


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 ...


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

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

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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.