配列にあるいくつかの月の名前を比較できるようにする必要があります。
次のような直接的な方法があればいいのですが。
Month.toInt("January") > Month.toInt("May")
私のGoogle検索では、独自のメソッドを作成することが唯一の方法であることが示唆されているようですが、これは.Netですでに実装されていると思われるほど一般的な問題のようです。
DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month
Dictionary<string, int>
ただし、目的のためには、月の名前をその値にマッピングするだけの方がよいでしょう。
次のようなことができます。
Convert.ToDate(month + " 01, 1900").Month
DateTime.ParseExact()
複数の人が提案した-methodを使用する場合は、アプリケーションが英語以外の環境で実行されたときに何をしたいのかを慎重に検討する必要があります。
デンマークでは、どちらがParseExact("Januar", ...)
機能ParseExact("January", ...)
し、どちらが失敗するのでしょうか。
それがとの違いにCultureInfo.CurrentCulture
なりCultureInfo.InvariantCulture
ます。
簡単な解決策の 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;
}
}
DateTime.Parse メソッドを使用して DateTime オブジェクトを取得し、その Month プロパティを確認できます。次のようにします。
int month = DateTime.Parse("1." + monthName + " 2008").Month;
秘訣は、有効な日付を作成して DateTime オブジェクトを作成することです。
月の列挙を使用できます。
public enum Month
{
January,
February,
// (...)
December,
}
public Month ToInt(Month Input)
{
return (int)Enum.Parse(typeof(Month), Input, true));
}
ただし、enum.Parse() の構文について 100% 確信があるわけではありません。
これを行うために 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 を渡すことができるオーバーロードを作成する方法は、読者の演習として残しておきます。
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
注意コードはベータ版です。
C# 3.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();