.NET库中是否有针对Month的预定义枚举?


97

我正在寻找.net框架中是否存在几个月的官方枚举。

在我看来,有一个可能是因为月使用的普遍程度,以及.net框架中还有其他这样的枚举。

例如,有一个星期几的枚举System.DayOfWeek,其中包括星期一,星期二等。

我想知道一年中的几个月(即一月,二月等)是否有一个?

有人知道吗?

Answers:


118

没有,但是如果您想要一个月的名字,可以使用:

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

这将返回一个字符串表示形式(在本例中为当月)。请注意,GetMonth参数的取值范围是1到13-一月是1,13是空白字符串。


11
那不是一个枚举。
Scott Wisniewski

3
谢谢,有趣的答案,不是我要找的东西,但仍然值得+!
马克·罗杰斯

4
我同意特定于文化的问题,但是微软为何随后创建了特定于文化的DayOfWeek。好笑吧?
马克·罗杰斯

12
也许是因为不同的文化有不同的月度日历,但是(显然)没有一个每周的天数不同。因此,每周的天是一致的,即使名字都没有。
瑞安·伦迪

11
如果您是一个对文化敏感的,时光飞逝的程序员,请注意,有些文化会用小数周(例如,法国革命)en.wikipedia.org/wiki/Decimal_calendar
马修·洛克

75

不,没有。


3
Microsoft.VisualBasic.MonthName
乔什·斯托多拉

14
您提供了什么有用的答案。也许一些其他指导会更合适。
Michael Eakins 2012年

13
@ guillegr123您如何建议我证明自己是负面的?
David Nelson

7
也许这并不能证明是负面的,但是一点推理也不会乱七八糟:没有枚举,因为枚举无法本地化。一月对俄罗斯程序员来说毫无意义。通过查看DO提供的月份名称的功能可以进一步支持该功能-它们位于Culture对象上。
山姆·阿克斯

8
投票以抵消这10个投票对这个问题的唯一实际答案。.NET中有几个月的官方枚举吗?不,没有。这没有什么意义,因为不是每个日历都有相同的月数,这也许就是为什么从未引入过。但这不是重点。有一个吗?否。问题已正确回答。
2016年

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?那么您也可以取消其余的任务。
Tersosauros

1
@Tersosauros,因为January例如,它将默认用作类的属性。在大多数情况下,我不希望这样做,我希望它在明确分配之前具有“空”值
wal

1
但是@wal,如果想要'null'值,则应将枚举用作可空值。在您的课堂上使用公共月?月{get; 组; }。
oteal

7
@Tersosauros注意,即使没有明确定义,0始终是枚举的默认值。如果NotSet省略并且January = 1(其余值分别为2、3等),则此枚举的默认值为(Month)0
tsemer

来发布同样的东西..这应该是答案。枚举可用于所有DateTime函数,即DateTime.Now.Month ==(int)Month.January
Sonic Soul

32

DateTimeFormatInfo.CurrentInfo.MonthNames(不是枚举,但我认为您通常在寻找DateTimeFormatInfo的CurrentInfo实例)。如果您想要一个下拉列表,则可以这样构建:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });

1
返回Enumerable.Range(0,11).Select(m => new {Id = month + 1,Name = DateTimeFormatInfo.CurrentInfo.MonthNames [month]});
基思·哈里森

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

13

在此命名空间的枚举“ MonthNamesType”中找到一个:Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

该位置有点吓人,但它仍然在那里。


我会为您提供正确的答案,但我认为这不是基础库.net框架的一部分。+1代表努力和创造力。
Mark Rogers,

似乎它是.net 3.5的一部分。只需在Visual Studio中打开对象查看器并搜索“ January”,API中的匹配项就会出现。
vidalsasoon,2009年

是的,我按照您的建议做了,看起来好像在v3.0文件夹中,它不是默认库。因此,尽管我猜它在图书馆中,但位置却不理想。就问题的要求而言,它处于灰色区域。
马克·罗杰斯

+1是肯定的努力。我们在这里谈论什么dll?
indolentdeveloper 2013年

10

您到底想完成什么?

如果您只需要12个字符串,并说明了一年中的月份,则可以通过自定义格式字符串使用-适用于日期时间的任何实例,

  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)

如果仅希望将月份指定为其他对象类型的枚举属性,则DateTime字段的Month属性将返回1到12之间的整数。


1
谢谢您的回答,我只是想知道是否有一个正式的枚举,因为我将要创建一个正式的枚举,并且我想知道是否已经存在一个正式的枚举,因此,我不会重新定义一个不需要的枚举。
Mark Rogers,

1
没有afaik,就没有,(如果您确实创建了一个,我将使整数值显式显示,请确保您与.Net用来表示monthNumbers的1-12值相同)
Charles Bretana

3

是的,肯定有。它是Microsoft.VisualBasic命名空间的一部分...

Microsoft.VisualBasic.MonthName

对于那些对此名称空间有疑问的人,您应该了解它确实是.NET,并且不会随处可见。

为了记录,该MonthName函数在内部调用以下内容...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName

1
抱歉,此答案与先前的答案存在相同的问题,因为它不是枚举,这是此问题的主题。不过,感谢您提供的信息。
马克·罗杰斯

@Mark:System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames是一个IEnumerable的字符串[]。
user169771

1
@ user169771-string []是一个,IEnumerable但不是一个enum。因此它不起作用。
Mark Rogers

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

我会寻找这样的东西来编码

        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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.