Skip to content

Instantly share code, notes, and snippets.

@cutsea110
Last active June 13, 2018 07:54
Show Gist options
  • Save cutsea110/dd855008668150fbc836e1c16c0cb9bd to your computer and use it in GitHub Desktop.
Save cutsea110/dd855008668150fbc836e1c16c0cb9bd to your computer and use it in GitHub Desktop.
ToWareki Method
static private Dictionary<int, string> __eraAbbreviatedEnglishEraNameDict = null;
static private Dictionary<int, string> eraAbbreviatedEnglishEraNameDict
{
get
{
if (__eraAbbreviatedEnglishEraNameDict == null)
{
CultureInfo cultureJp = new CultureInfo("ja-JP", true);
cultureJp.DateTimeFormat.Calendar = new JapaneseCalendar();
Type t = typeof(DateTimeFormatInfo);
PropertyInfo pi
= t.GetProperty("AbbreviatedEnglishEraNames", BindingFlags.NonPublic | BindingFlags.Instance);
string[] abbreviatedEnglishEraNames = (string[])pi.GetValue(cultureJp.DateTimeFormat, null);
// 取得したabbreviatedEnglishEraNames配列から、年号テーブルを作る
__eraAbbreviatedEnglishEraNameDict = new Dictionary<int, string>();
for (int i = 0; i < abbreviatedEnglishEraNames.Length; i++)
__eraAbbreviatedEnglishEraNameDict.Add(i + 1, abbreviatedEnglishEraNames[i]);
}
return __eraAbbreviatedEnglishEraNameDict;
}
}
/// <summary>
/// 和暦の英略称を返す
/// </summary>
public static Func<int, string> ConvAbbrevEnName = (eraNum) => { return eraAbbreviatedEnglishEraNameDict[eraNum]; };
/// <summary>
/// 和暦を返す
/// GGを特殊な指定子として使用しています.
/// System.Globalization.JapaneseCalendar.GetEraメソッドの返り値をどんな文字列に変換するかの変換関数を渡すことで元号の表示をカスタマイズ可能にした。
/// </summary>
/// <param name="d"></param>
/// <param name="fmt">通常はggのままでOK.カスタマイズしたければGGと指定する</param>
/// <param name="convToEraName">GG書式指定をカスタマイズしたいときには変換関数を渡す.引数にはSystem.Globalization.JapaneseCalendarのGetEraの返り値が渡ってくる.無指定時はggと指定したのと同じ.</param>
/// <returns></returns>
public static string ToWareki(this DateTime d, string fmt = "GGy年M月d日", Func<int, string> convToEraName = null)
{
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
if (convToEraName == null) convToEraName = (x) => d.ToString("gg", culture);
var eraName = convToEraName(culture.DateTimeFormat.Calendar.GetEra(d));
return d.ToString(fmt, culture).Replace("GG", eraName);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment