Чи є заздалегідь визначене число для місяця в бібліотеці .NET?


97

Я дивлюсь, чи існує офіційне перерахування місяцями в рамках .net.

Мені здається можливим, що існує одне, через те, наскільки поширене використання місяця, і тому, що в рамках .net є інші такі перерахування.

Наприклад, існує перелік днів у тиждень System.DayOfWeek, що включає понеділок, вівторок тощо.

Мені цікаво, чи є такий для місяців у році, тобто січень, лютий тощо?

Хтось знає?

Відповіді:


118

Немає, але якщо ви хочете назву місяця, ви можете використовувати:

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

який поверне рядкове подання (поточного місяця в даному випадку). Зауважте, що GetMonthприймає аргументи з 1 по 13 - січень - 1, 13 - це порожній рядок.


11
Але це не перерахунок.
— Скотт Вішневський

3
Дякую, цікава відповідь, не те, що я шукав, але все-таки варто +!
— Марк Роджерс

4
Я погоджуюсь щодо конкретного питання культури, але чому тоді мікрософт створив DayOfWeek, це специфічно для культури. Смішно, так?
— Марк Роджерс

12
Можливо, тому, що різні культури мають різні місячні календарі, але існує (мабуть) не одна, яка має різну кількість днів на тиждень. Тож кількість днів на тиждень є послідовною, навіть якщо імена немає.
— Райан Лунді

11
Якщо ви культурно чутливий, програмуючий час, майте на увазі, що існували культури, які мали десятковий тиждень (наприклад, Революційна Франція) en.wikipedia.org/wiki/Decimal_calendar
— Метью Лок

75

Ні, немає.


3
Про що Microsoft.VisualBasic.MonthName?
— Джош Стодола

14
Яку корисну відповідь ви надали. Можливо, деякі додаткові вказівки були б доречнішими.
— Майкл Екінс

13
@ guillegr123 Як ти запропонував би мені довести доведення негативу?
— Девід Нельсон

7
Можливо, це не доводить негативу, але невеликі міркування не вийшли з ладу: перерахунок не існує, оскільки переліки не можуть бути локалізовані. Місяці.Януарій мало би мало значення для російського програміста. Це додатково підтримується переглядом функцій, які DO надають імена місяців - вони розташовані на об’єкті культури.
— Сем Акс

8
Запрошення протидіяти 10 голосів для єдиної реальної відповіді на це питання. Чи існує офіційне перерахування місяців у .NET? Ні, немає. Було б мало сенсу, тому що не кожен календар має однакову кількість місяців, і, можливо, тому його ніколи не вводили. Але тут справа не в цьому. Є такий? Ні. На питання відповів правильно.
— см

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
}

Навіщо використовувати NotSet? Чому б просто не почати з January = 1? тоді ви могли б покінчити і з іншими завданнями ..
— Терсосаврос

1
@Tersosauros, тому що тоді він буде за замовчуванням, Januaryякщо, наприклад, його використовувати як властивість для класу. у більшості випадків я цього не хочу, я хочу, щоб він мав значення "null", перш ніж воно буде явно призначено
— wal

1
Але @wal, якщо ви хочете значення 'null', вам слід використовувати enum як нульовий. У своєму класі використовуйте публічний місяць? Місяць {отримати; набір; }.
— упорядкування

7
@Tersosauros зауважимо, що 0 завжди буде значенням enum за замовчуванням, навіть якщо воно не визначено прямо. Якщо NotSetпропущено і January = 1(а решта значень 2, 3 і т.д.), то за замовчуванням цей перерахунок буде(Month)0
— цемер

прийшов опублікувати те ж саме .. це має бути відповідь. Enum може бути використаний проти всіх функцій DateTime, тобто DateTime.Now.Month == (int) Місяць. Януар
— 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 = місяць + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [місяць]});
— Кіт Гаррісон

var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
— Dan Diplo

13

Знайдено в enum "MonthNamesType" цього простору імен: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Розташування начебто лякає, але все-таки воно там.


Я би призначив вам правильну відповідь, але я не думаю, що це частина базової бібліотеки .net. +1 за зусилля та творчість.
— Марк Роджерс

здається, що це частина .net 3.5. Просто відкрийте програму перегляду об’єктів у Visual Studio та знайдіть "Січень" та збіги в API.
— vidalsasoon

Так, я зробив, як ви запропонували, схоже, це в папці v3.0, і це не бібліотека за замовчуванням. Тож я думаю, що це в бібліотеці, але його розташування є менш ніж ідеальним. Це в чомусь сірому районі, наскільки це стосується вимог питання.
— Марк Роджерс

+1 напевно буде зусиллям. Про що тут говоримо?
— indolentdeveloper

10

Що саме ви намагаєтеся зробити?

якщо все, що вам потрібно, - це дванадцять рядків із прописаними місяцями року, то це доступно через спеціальний рядок формату - застосовується для будь-якого примірника дати,

  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, немає жодного, (Якщо ви створюєте один, я б цілі значення явно, увібрати ви можете ensurethey такі ж , як 1-12 значення , використовувані для представлення Нетто monthNumbers)
— Чарльз Bretana

3

Так, безумовно, є. Це частина простору імен Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

А для тих із вас, хто має проблеми з цим простором імен, ви повинні розуміти, що він справді є .NET, і він нікуди не дінеться .

Для запису MonthNameфункція внутрішньо викликає наступне ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName

1
Вибачте, але ця відповідь має ту саму проблему, що і попередня відповідь, оскільки це не перерахування, яке є темою цього питання. Все-таки дякую за інформацію.
— Марк Роджерс

@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames - це рядок [], який є безліч.
— користувач169771

1
@ user169771 - string [] - це, 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.