99

配列にあるいくつかの月の名前を比較できるようにする必要があります。

次のような直接的な方法があればいいのですが。

Month.toInt("January") > Month.toInt("May")

私のGoogle検索では、独自のメソッドを作成することが唯一の方法であることが示唆されているようですが、これは.Netですでに実装されていると思われるほど一般的な問題のようです。

4

14 に答える 14

189

DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month

Dictionary<string, int>ただし、目的のためには、月の名前をその値にマッピングするだけの方がよいでしょう。

于 2008-11-03T14:40:18.793 に答える
22

次のようなことができます。

Convert.ToDate(month + " 01, 1900").Month
于 2008-11-03T14:42:23.530 に答える
19

DateTime.ParseExact()複数の人が提案した-methodを使用する場合は、アプリケーションが英語以外の環境で実行されたときに何をしたいのかを慎重に検討する必要があります。

デンマークでは、どちらがParseExact("Januar", ...)機能ParseExact("January", ...)し、どちらが失敗するのでしょうか。

それがとの違いにCultureInfo.CurrentCultureなりCultureInfo.InvariantCultureます。

于 2008-11-03T14:58:58.943 に答える
10

簡単な解決策の 1 つは、名前と値を含む Dictionary を作成することです。次に、Contains() を使用して、正しい値を見つけることができます。

Dictionary<string, string> months = new Dictionary<string, string>()
{
                { "january", "01"},
                { "february", "02"},
                { "march", "03"},
                { "april", "04"},
                { "may", "05"},
                { "june", "06"},
                { "july", "07"},
                { "august", "08"},
                { "september", "09"},
                { "october", "10"},
                { "november", "11"},
                { "december", "12"},
};
foreach (var month in months)
{
    if (StringThatContainsMonth.ToLower().Contains(month.Key))
    {
        string thisMonth = month.Value;
    }
}
于 2015-05-06T23:48:51.610 に答える
9

DateTime.Parse メソッドを使用して DateTime オブジェクトを取得し、その Month プロパティを確認できます。次のようにします。

int month = DateTime.Parse("1." + monthName + " 2008").Month;

秘訣は、有効な日付を作成して DateTime オブジェクトを作成することです。

于 2008-11-03T14:43:48.893 に答える
9

月の列挙を使用できます。

public enum Month
{
    January,
    February,
    // (...)
    December,
}    

public Month ToInt(Month Input)
{
    return (int)Enum.Parse(typeof(Month), Input, true));
}

ただし、enum.Parse() の構文について 100% 確信があるわけではありません。

于 2008-11-03T14:47:04.597 に答える
7

これを行うために DateTime インスタンスを作成する必要はありません。次のように簡単です。

public static class Month
{
    public static int ToInt(this string month)
    {
        return Array.IndexOf(
            CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
            month.ToLower(CultureInfo.CurrentCulture))
            + 1;
    }
}

私はda-DKカルチャで実行しているので、この単体テストはパスします:

[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
    var actual = monthName.ToInt();
    Assert.Equal(expected, actual);
}

明示的な CultureInfo を渡すことができるオーバーロードを作成する方法は、読者の演習として残しておきます。

于 2012-09-22T20:32:45.533 に答える
1
Public Function returnMonthNumber(ByVal monthName As String) As Integer
    Select Case monthName.ToLower
        Case Is = "january"
            Return 1
        Case Is = "february"
            Return 2
        Case Is = "march"
            Return 3
        Case Is = "april"
            Return 4
        Case Is = "may"
            Return 5
        Case Is = "june"
            Return 6
        Case Is = "july"
            Return 7
        Case Is = "august"
            Return 8
        Case Is = "september"
            Return 9
        Case Is = "october"
            Return 10
        Case Is = "november"
            Return 11
        Case Is = "december"
            Return 12
        Case Else
            Return 0
    End Select
End Function

注意コードはベータ版です。

于 2010-11-09T10:28:17.913 に答える
1

C# 3.0 (またはそれ以降) を使用している場合は、エクステンダーを使用できます

于 2008-11-03T14:36:35.243 に答える
0

私がしたことは、SimpleDateFormat を使用してフォーマット文字列を作成し、テキストを日付に解析してから、そこから月を取得することでした。コードは以下のとおりです。

int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
于 2012-09-07T05:58:41.947 に答える