Чи є заздалегідь визначене число для місяця в бібліотеці .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.