JAN,FEB/MAR... 英語の月の略語

英語で各月の略号は3文字の短い形式があります。

以下表の通り各月は3文字の大文字で表されます。

英略
01月 JAN January
02月 FEB February
03月 MAR March
04月 APR April
05月 MAY May
06月 JUN June
07月 JUL July
08月 AUG August
09月 SEP September
10月 OCT October
11月 NOV November
12月 DEC December

C#で略号をDateTimeに変換する方法

C# で上記3文字の略号から月を取得する場合 "MMM" というキーワードを使用します。使い方は以下の通り。

// 略号から月を取得する
using System.Globalization;

public static void Foo()
{
    string key = "SEP"; // September -> 9月
    bool isOk = DateTime.TryParseExact(key, "MMM", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result);
    if(isOk)
    {
        // 1900/09/01 00:00:00 になってるので月だけ取得する
        int month = result.Month;
        Console.WriteLine(month);
        // > 9
    }
    
    // 以下の書き方でも良いが key が変換できないと例外が発生する
    DateTime result2 = DateTime.ParseExact(key, "MMM", CultureInfo.InvariantCulture);
}

省略しない完全な名前で月を取得する場合は "MMMM" というキーワードを使用します。

// 完全名から月を取得する
using System.Globalization;

public static void Foo()
{
    string key = "December"; // 12月
    bool isOk = DateTime.TryParseExact(key, "MMMM", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result);
    if(isOk)
    {
        // 1900/12/01 00:00:00 になってるので月だけ取得する
        int month = result.Month;
        Console.WriteLine(month);
        // > 12
    }
    
    // 以下の書き方でも良いが key が変換できないと例外が発生する
    DateTime result2 = DateTime.ParseExact(key, "MMMM", CultureInfo.InvariantCulture);
}

DateTime型から略号を取得する方法

DateTime 型から月の略語を取得するときも MMM を使いますが、OSの設定が日本語だと以下のように「12月」と日本語で出力されます。

string str = DateTime.Now.ToString("MMM");
// 12月

// このプロパティによって出力が決まる
var c = Thread.CurrentThread.CurrentCulture;
// ja-jp

この時どういう出力がされるのかは、ToString の引数の IFormatProvider を省略した場合、今のスレッドの CurrentCulture が参照されます。OS の言語設定次第で変わってしまうのでフランス語設定などにしているとまた全然違う出力になります。

なので、「英語」の「3文字の短縮形」を出力した場合以下のように英語を指定するパラメーターを引数に指定します。

string str = DateTime.Now.ToString("MMM", new CultureInfo("en-us"));
// Dec