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)
就可以正確顯示民國年了!