日本历转换问题(转)

来自:http://blog.163.com/iamtomato@126/blog/static/305599902007523142225/

 

  在作多国化开发时常遇到不同地域示日期的转换问题。其中日本的和历转换特殊,拿出来侃侃。
日本个皇帝的标识为一个元。当前元是 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命名空)是用来控制示日期的地域。
JapaneseCalendarSystem.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);// gg:如平成,昭和等等.

            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 象的使用, 其他地域日期示也不在

 

以下是本人修改的例子...VB.NET

 Dim dt As Date
        Dim boo As Boolean
        boo = DateTime.TryParseExact(Format(Now(), "yyyyMMdd"), "yyyyMMdd", Nothing, Globalization.DateTimeStyles.None, dt)  '如果不存在的日期时,返回False

        Dim ci As CultureInfo = New CultureInfo("ja-JP")
        Dim cal As Calendar = New JapaneseCalendar
        ci.DateTimeFormat.Calendar = cal

        'Dim strWri As String = ci.DateTimeFormat.GetAbbreviatedEraName(Calendar.CurrentEra) + dt.ToString("ggyy年M月d日", ci)   'Calendar.CurrentEra:当前纪元
        Dim strWri As String = ci.DateTimeFormat.GetAbbreviatedEraName(cal.GetEra(dt)) + dt.ToString("ggyy年M月d日", ci)  'cal.GetEra(dt)):取得纪元

    Dim ci As CultureInfo = New CultureInfo("ja-JP")
        Dim cal As Calendar = New JapaneseCalendar
        ci.DateTimeFormat.Calendar = cal

    Dim era As String() = {"M", "T", "S", "H"}

    ’Dim era As String() = {"明治", "大正", "昭和", "平成"}
        Console.WriteLine(ci.DateTimeFormat.GetEraName(cal.GetEra(dt)) & dt.ToString("yy/MM/dd", ci))
        Console.WriteLine(era(cal.GetEra(dt) - 1) & dt.ToString("yy/MM/dd", ci))
        Console.WriteLine(era(cal.GetEra(dt) - 1) & cal.GetYear(dt) & dt.ToString("/MM/dd", ci))

 

没有更多推荐了,返回首页