Есть ли предопределенное перечисление для месяца в библиотеке .NET?

99

Я ищу, есть ли официальное перечисление месяцев в структуре .net.

Мне кажется возможным, что он есть, из-за того, насколько часто используется месяц, и потому, что в структуре .net есть другие подобные перечисления.

Например, есть перечисление дней недели, System.DayOfWeek, которое включает понедельник, вторник и т. Д.

Мне интересно, есть ли один для месяцев в году, то есть января, февраля и т. Д.?

Кто-нибудь знает?

Марк Роджерс
источник

Ответы:

119

Нет, но если вам нужно название месяца, вы можете использовать:

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

который вернет строковое представление (в данном случае текущего месяца). Обратите внимание, что GetMonthпринимает аргументы от 1 до 13 - 1 января, 13 - пустая строка.

Энди Микула
источник
11
Однако это не перечисление.
Скотт Вишневски
3
Спасибо, интересный ответ, не то, что искал, но все же стоит +!
Марк Роджерс,
4
Я согласен с проблемой, связанной с культурой, но почему тогда Microsoft создала DayOfWeek, это зависит от культуры. Смешно, да?
Марк Роджерс
12
Возможно, потому, что в разных культурах есть разные ежемесячные календари, но (по-видимому) нет ни одного, в котором разное количество дней в неделе. Таким образом, количество дней в неделе одинаково, даже если имена не совпадают.
Райан Ланди,
11
Если вы культурно чувствительный программист, путешествующий во времени, имейте в виду, что были культуры, в которых была десятичная неделя (например, революционная Франция) en.wikipedia.org/wiki/Decimal_calendar
Мэтью Лок
76

Нет, нет.

Дэвид Нельсон
источник
3
О чем Microsoft.VisualBasic.MonthName?
Джош Стодола
14
Какой полезный ответ вы дали. Возможно, более подходящим было бы какое-то дополнительное руководство.
Майкл Икинс,
13
@ guillegr123 Как бы вы посоветовали мне доказать отрицательный результат?
Дэвид Нельсон
7
Возможно, это не доказывает отрицания, но небольшое рассуждение было бы неуместным: перечисления нет, потому что перечисления нельзя локализовать. Месяцы Январь мало что значат, если вообще не имеют значения для русского программиста. Это дополнительно подтверждается просмотром функций, которые ДОЛЖНЫ предоставлять имена месяцев - они расположены в объекте Culture.
Сэм Экс,
8
Голосование за противодействие 10 голосам против единственного ответа на этот вопрос. Есть ли в .NET официальное перечисление месяцев? Нет, нет. В этом мало смысла, потому что не в каждом календаре одинаковое количество месяцев, и, возможно, поэтому он никогда не был введен. Но дело не в этом. Есть один? Нет. Вопрос ответил правильно.
sm
39

Я ищу, есть ли официальное перечисление месяцев в структуре .net.

Нет.

Вот один, который я приготовил ранее. (Версия 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
источник
Зачем использовать NotSet? Почему бы просто не начать January = 1? тогда вы могли бы покончить с остальными заданиями ...
Tersosauros
1
@Tersosauros, потому что тогда он будет по умолчанию, Januaryесли, например, он используется как свойство для класса. в большинстве случаев я не хочу этого, я хочу, чтобы у него было нулевое значение, прежде чем оно будет явно присвоено
wal
1
Но @wal, если вам нужно значение null, вы должны использовать свое перечисление как допускающее значение null. В вашем классе использовать публичный месяц? Месяц {получить; устанавливать; }.
oteal
7
@Tersosauros отмечает, что 0 всегда будет значением по умолчанию для перечисления, даже если оно не определено явно. Если NotSetопущено и January = 1(а остальные значения - 2, 3 и т. Д.), (Month)0
То
пришел, чтобы написать то же самое .. это должен быть ответ. Enum можно использовать для всех функций DateTime, то есть DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(не перечисление, но я думаю, что экземпляр CurrentInfo DateTimeFormatInfo - это то, что вы ищете в целом). Если вам нужен раскрывающийся список, вы можете создать его следующим образом:

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 => new {Id = month + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [месяц]});
Кейт Харрисон
var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Дэн Дипло
13

Нашел один в перечислении "MonthNamesType" этого пространства имен: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Расположение немного пугает, но тем не менее оно есть.

Vidalsasoon
источник
Я бы наградил вас правильным ответом, но я не думаю, что это часть базовой библиотеки .NET framework. +1 за старания и творчество.
Марк Роджерс
похоже, что это часть .net 3.5. Просто откройте средство просмотра объектов в Visual Studio и выполните поиск по запросу «Январь», и в API появятся совпадения.
vidalsasoon
Да, я сделал, как вы предложили, похоже, он находится в папке v3.0, и это не библиотека по умолчанию. Так что, хотя я предполагаю, что он находится в библиотеке, его расположение не совсем идеальное. Что касается требований вопроса, это что-то вроде серой зоны.
Марк Роджерс,
+1 был бы за усилие точно. О какой dll идет речь?
indelentdeveloper
10

Чего именно вы пытаетесь достичь?

если все, что вам нужно, это двенадцать строк с указанием месяцев года, то это доступно через строку настраиваемого формата, применяемую к любому экземпляру datetime,

  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)

если вы просто хотите указать месяц как перечислимое свойство какого-либо другого типа объекта, тогда свойство Month поля DateTime возвращает целое число от 1 до 12 ...

Чарльз Бретана
источник
1
Спасибо за ваш ответ, мне просто любопытно, есть ли официальное перечисление, потому что я собираюсь его создать, и мне просто хотелось бы знать, существует ли уже существующее, поэтому я не переопределяю ненужное перечисление .
Марк Роджерс
1
Нет afaik, его нет (если вы его создадите, я бы сделал целочисленные значения явными, поэтому вы можете убедиться, что они совпадают со значениями 1-12, используемыми .Net для представления monthNumbers)
Чарльз Бретана,
3

Да, конечно, есть. Это часть пространства имен Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

И тем из вас, у кого есть проблема с этим пространством имен, вы должны понимать, что это действительно .NET, и он никуда не денется .

Для записи MonthNameфункция внутренне вызывает следующее ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Джош Стодола
источник
1
Извините, но у этого ответа та же проблема, что и у предыдущего ответа, поскольку это не перечисление, которое является темой этого вопроса. Тем не менее, спасибо за информацию.
Марк Роджерс
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames - это строка [], которая является IEnumerable.
user169771 04
1
@ user169771 - строка [] является, IEnumerableно не ее вариантом enum. Так что это не работает.
Марк Роджерс
2

У некоторых календарей действительно больше 12 месяцев: http://en.wikipedia.org/wiki/Month, но я не могу сказать, было ли это причиной того, что MS не построила перечисление в .NET.

Для ленивых вроде меня, которым хотелось бы копировать / вставить в 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

Я не знаю точно, но думаю, что нет. DateTime.Month возвращает целое число. Если бы такое перечисление было, его, вероятно, вернула бы DateTime.

Скотт Вишневски
источник
1

Я бы искал что-то подобное, чтобы закодировать, как

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

имеет это магическое число 1. в то время как

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

самодокументируется

Джадавин
источник
0

Перечисление было бы весьма полезно, но вы можете получить желаемый результат с помощью формата:

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

Это возвращает полное название месяца (январь, февраль и т. Д.). Используйте myDateTimeObject.ToString("MMM")для краткого названия (январь, февраль, март и т. Д.).

Если у вас есть конкретный номер месяца mnthNum, без каких - либо DateTime, вы всегда можете использовать что - то вроде этого:

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

или

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

Но это кажется немного запутанным. В первом примере это значение должно mnthNumбыть от 1 до 12. Второй пример позволяет (почти) использовать любой месяц и не ограничивается числом от 1 до 12.

Кит
источник