日本西历和和历的转换(转)

来源:互联网 发布:null是java关键字吗 编辑:程序博客网 时间:2024/06/09 16:14

在作多国化用开发时常遇到不同地域示日期的转换问题。其中日本的和历转换特殊,拿出来侃侃。
日本将每个皇帝的标识为一个元。当前元是 Heisei 元,始于公 1989 年。元名称通常示在年份前。例如,公 2001 年是日本 Heisei 13 年。注意,元的第一年称“Gannen”;所以公 1989 年是日本 Heisei Gannen 年。

元名称

日期

平成 (Heisei)
(H, h)
1989
1 8 日至今


昭和 (Showa)
(S, s)
1926
12 25 日至 1989 1 7


大正 (Taisho)
(T, t)
1912
7 30 日至 1926 12 24


明治 (Meiji)
(M, m)
1868
9 8 日至 1912 7 29
 

所以根据日本习惯 2006/09/26 应该被表示 平成18926 或者是 H18/9/26

在国用中,CultureInfo(System.Globalization命名空)是用来控制示日期的地域。
JapaneseCalendar
System.Globalization命名空下)表示日本
以下是几种日期转换的代
1) 2006/09/26
转换为 平成18/09/26

CultureInfo ci = new CultureInfo("ja-JP");
Calendar cal = new JapaneseCalendar();
ci.DateTimeFormat.Calendar = cal;
DateTime dt = DateTime.Parse("2006/09/26");
string strWareki = dt.ToString("ggyy/MM/dd", ci);
Console.WriteLine(strWareki); // output:
平成
18/09/26
当然其中 gyy/MM/dd 可以用 gyyMMdd日。

2)
平成18/09/26 转换为 2006/09/26 

CultureInfo ci = new CultureInfo("ja-JP");
Calendar cal = new JapaneseCalendar();
ci.DateTimeFormat.Calendar = cal;
string strWareki = "
平成
18/09/26";
string strDate = DateTime.ParseExact(strWareki, "ggyy/MM/dd", ci).ToString("yyyy/MM/dd");
Console.WriteLine(strDate); // output: 2006/09/26

ps: strWareki = "
18/09/26"; 也是可以成功转换的。

3) 2006/09/26
转换为 18/09/26 ( """平成")

CultureInfo ci = new CultureInfo("ja-JP");
Calendar cal = new JapaneseCalendar();
ci.DateTimeFormat.Calendar = cal;
DateTime dt = DateTime.Parse("2006/09/26");
string strWareki = ci.DateTimeFormat.GetAbbreviatedEraName(cal.GetEra(dt)) + dt.ToString("yy/MM/dd", ci);
Console.WriteLine(strWareki); // output:
18/09/26
GetAbbreviatedEraName()
方法根据元序号该纪元名称的写。

4) 2006/09/26
转换为 H18/09/26 ( "H""平成"的英文)
里因DateTimeFormat没有提供直接的方法,因此稍微麻点。

方法一:

string[] engEras = {"M", "T", "S", "H"};
Calendar cal = new JapaneseCalendar();
DateTime dt = DateTime.Parse("2006/09/26");
string strWareki = dt.ToString("{0}{1}/MM/dd");
strWareki = string.Format(strWareki, engEras[cal.GetEra(dt) - 1], cal.GetYear(dt).ToString("00"));
Console.WriteLine(strWareki); // output: H18/09/26
此方法展性差,万一日本当今的天皇挂了,句出来的和就不了。。。
方法二:
利用反射,需要引用 System.Reflection , DateTimeFormatInfo 中非公开的属性 —— AbbreviatedEnglishEraNames

CultureInfo ci = new CultureInfo("ja-JP");
Calendar cal = new JapaneseCalendar();
ci.DateTimeFormat.Calendar = cal;
DateTime dt = DateTime.Parse("2006/09/26");
Type t = typeof( DateTimeFormatInfo );
PropertyInfo pi = t.GetProperty( "AbbreviatedEnglishEraNames", BindingFlags.NonPublic|BindingFlags.Instance );
string[] engEras = (string[])pi.GetValue( ci.DateTimeFormat, null );
int era = cal.GetEra(dt);
string strWareki = engEras[era-1] + dt.ToString("yy/MM/dd", ci);
Console.WriteLine(strWareki); // output: H18/09/26
方法可以通 System.dll 用程序,是比好的转换方法。

以上是一些常用的日本日期转换的代,只要掌握 CultureInfo Calendar 象的使用, 其他地域日期示也不在下了。