Last active
June 13, 2018 07:54
-
-
Save cutsea110/dd855008668150fbc836e1c16c0cb9bd to your computer and use it in GitHub Desktop.
ToWareki Method
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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