WP 民國日期的轉換

WP 民國日期的轉換

最近我在做銀行的app,他的規格是專為台灣訂做的,所以裡面常會出現民國年,

所以每次不論顯示或是傳送資料需要用到民國年的時候,都要特別轉換一下,

好在的是民國年和西元年互換非常簡單,就是減1911而已,

不過如果直接用

DateTime.Now.AddYears(-1911)

在2月29日的時候會出現錯誤,而且感覺不專業啊!!!

 

所以想到用預設的Calendar來轉換。

而在wp8中很開心的有內建!!

TwCultureInfo = new CultureInfo("zh-TW");
TwCultureInfo.DateTimeFormat.Calendar = TwCultureInfo.OptionalCalendars[1];
Debug.WriteLine(DateTime.Now.ToString("yyy-MM-dd", TwCultureInfo));

 

今天是2013/03/21的話,就會印出102-03-21。

如果你查看TwCultureInfo.OptionalCalendars的內容,

會發現他有三個Calendar,第一個是GregorianCalendar,第二個是TaiwanCalendar,第三個和第一個一樣是GregorianCalendar

TaiwanCalendar就會幫我們把台灣相關曆法設定好!

 

不過很不幸地在wp7這招沒用,如果你在wp7上查看TwCultureInfo.OptionalCalendars的內容,

就會發現三個都是GregorianCalendar,不過還是有方法!

就是自己做一個Calendar!

 

首先設計一個TwCalendar

public class TwCalendar : GregorianCalendar {
    public TwCalendar()
        : base() {
 
    }
 
    public override DateTime MinSupportedDateTime {
        get {
            return new DateTime(1911, 1, 1);
        }
    }
 
    public override int GetYear(DateTime time) {
        return time.Year - 1911;
    }
}

這裡繼承GregorianCalendar是因為若直接繼承Calendar,就要改寫很多東西,

我們只是要轉換民國年而已其他都不變,所以就直接繼承GregorianCalendar就好。

然後覆寫MinSupportedDateTime和GetYear。

 

接著,我們用和上面類似的方法設定

TwCultureInfo = new CultureInfo("zh-TW");
TwCultureInfo.DateTimeFormat.Calendar = new TwCalendar();

 

不過這招在wp8就會爆炸喔!,因為DateTimeFormat.Calendar的值必須是mscorlib.dll內的物件才可以,

所以這樣設定會出現Cannot set sub-classed XXX.TwCalendar object to System.Globalization.DateTimeFormatInfo object.的錯誤

 

最後為了因應七和八的不同,特地做了一個類別

 public class Helper {
     public static CultureInfo TwCultureInfo { get; set; }
     static Helper() {
         TwCultureInfo = new CultureInfo("zh-TW");
         if (Environment.OSVersion.Version.Major == 7) {
             TwCultureInfo.DateTimeFormat.Calendar = new TwCalendar();
         } else {
             TwCultureInfo.DateTimeFormat.Calendar = TwCultureInfo.OptionalCalendars[1];
         }
     }
 }
 
 public class TwCalendar : GregorianCalendar {
     public TwCalendar()
         : base() {
 
     }
 
     public override DateTime MinSupportedDateTime {
         get {
             return new DateTime(1911, 1, 1);
         }
     }
 
     public override int GetYear(DateTime time) {
         return time.Year - 1911;
     }
 }

 

 

這樣只要在顯示時間的時候用DateTime.Now.ToString("yyyMMdd", Helper.TwCultureInfo)

就可以正確顯示民國年了!