.NETライブラリに月の事前定義された列挙はありますか?


97

.netフレームワークで数か月間の公式の列挙があるかどうかを確認しようとしています。

月の使用がどれほど一般的であるか、および.netフレームワークに他のそのような列挙があるため、1つあると私には考えられます。

たとえば、月曜日、火曜日などを含むSystem.DayOfWeekの曜日の列挙があります。

1月、2月など、1か月に1つあるのかどうか疑問に思います。

誰か知っている?

回答:


118

ありませんが、月の名前が必要な場合は、次のように使用できます。

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

(この場合、現在の月の)文字列表現を返します。GetMonth1から13までの引数を取ることに注意してください-1月は1、13は空の文字列です。


11
しかし、それは列挙型ではありません。
Scott Wisniewski、

3
ありがとう、興味深い答え、私が探していたものではありませんが、それでも+の価値があります!
マークロジャース

4
カルチャー固有の問題については同意しますが、マイクロソフトがDayOfWeekを作成した理由は、カルチャー固有です。面白いでしょ?
マークロジャース

12
おそらく、さまざまな文化では月間カレンダーが異なるためですが、(どうやら)週ごとに日数が異なるものはありません。だから、週日数のがあっても一貫性のある名前がありません。
Ryan Lundy

11
文化に敏感で時間を移動するプログラマーである場合は、10週の文化(たとえば、フランス革命)en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock

75

いいえ、ありません。


3
どうMicrosoft.VisualBasic.MonthNameですか?
Josh Stodola、2010年

14
あなたが提供したなんて便利な答え。おそらく、いくつかの追加のガイダンスがより適切でした。
Michael Eakins 2012

13
@ guillegr123私がネガティブを証明しようとすることをどのように提案しますか?
David Nelson、

7
おそらくそれは否定的なことを証明しないかもしれませんが、少しの推論が乱れることはありません:enumはローカライズできないため、enumはありません。Months.Januaryは、ロシアのプログラマにとっては意味がないにしてもほとんど意味がありません。これは、月名を提供する関数を調べることによってさらにサポートされます-それらは、Cultureオブジェクトにあります。
Sam Ax

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
}

なぜ使用NotSet?なぜ最初から始めないのJanuary = 1ですか?そして、あなたも割り当ての残りの部分と離れて行うことができます。..
Tersosauros

1
@Tersosauros Januaryは、たとえば、クラスのプロパティとして使用された場合にデフォルトになるためです。ほとんどの場合、私はそれを望まない、明示的に割り当てられる前に「null」値を設定したい
wal

1
しかし、@ wal、「null」値が必要な場合は、列挙型をnull可能として使用する必要があります。あなたのクラスでは公開月を使用しますか?月{取得; セットする; }。
16年

7
@Tersosaurosは、明示的に定義されていなくても、0は常に列挙型のデフォルト値になることに注意してください。場合はNotSet省略しているJanuary = 1(および値の残りの部分は、図3に示すように、2等である)、この列挙のデフォルトは次のようになり(Month)0
tsemer

同じ事を投稿するようになった..これは答えでなければなりません。Enumはすべての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
return 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"で1つ見つかりました:Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

場所はちょっと怖いですが、それでもそれはあります。


正解をお伝えしますが、これはベースライブラリの.netフレームワークの一部ではないと思います。努力と創造性のための+1。
マークロジャース

.net 3.5の一部のようです。Visual Studioでオブジェクトビューアを開き、「January」を検索すると、APIで一致するものが表示されます。
vidalsasoon 2009年

ええ、私はあなたが示唆したように、それはv3.0フォルダにあるように見え、それはデフォルトのライブラリではありません。図書館にあると思いますが、その場所は理想的とは言えません。質問の要件に関する限り、それは灰色の領域の中にあります。
マークロジャース

+1は確かに努力のためです。ここではどのDLLについて話しているのですか?
indolentdeveloper

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
あなたの答えをありがとう、私はそれを作成しようとしていて、すでに存在するものがあるかどうか知りたいので、公式の列挙があるかどうか知りたいだけなので、不要な列挙を再定義しません。
マークロジャース

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であるstring []です。
user169771 2015

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

これにより、完全な月の名前(January、2月など)が返されます。利用myDateTimeObject.ToString("MMM")短い名前のために(月、2月、月、など)。

特定の月番号がある場合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が必要です。2番目の例では、(ほぼ)任意の月数が可能で、1〜12に制限されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.