【C#】民國年轉西元年;西元年轉民國年

  • 41
  • 0
  • C#
  • 2020-06-12

之前懵懵懂懂寫程式遇到西元年民國年的轉換

來看看初學者會碰到的雷吧!

那時候,天真如我還真的用字串轉換數字,再把數字扣掉1911來算

燈愣~其實這是錯的!

year = (int.Parse(item.date.Substring(0, 2)) + 1911).ToString();
month = item.date.Substring(2, 2);
day = item.date.Substring(4, 2);

如果我是初學者,看到前輩程式碼這樣寫,百分之千,一定copy paste

這篇文章主要用意是告訴初學者

別人的Code不要亂抄!

雖然我自己的code也滿糞的啦XD 但民國有點基本,那就賣來亂了~

來看看為啥會這樣啦

var dt1 = new DateTime(2012,02,29);
dt1.Dump();

var dt2 = dt1.AddYears(-1911);
dt2.Dump();

結果:

奇怪怎麼變成0101/02/28....

有些前輩會跟你說,程式難免會錯誤,遇到的機會四年也只有一次!

專案這麼多,有人反映有錯再改!讚~

改的人是誰不知道 XD 

看到這篇的同時,你應該是那個倒楣鬼....

前言講很多廢話,下面來個解法~

public class TaiwanCalendar : System.Globalization.Calendar

docs

使用 TaiwanCalendar 類別

string sampleDate = "101/02/29";
CultureInfo culture = new CultureInfo("zh-TW");
culture.DateTimeFormat.Calendar = new TaiwanCalendar();
DateTime.Parse(sampleDate,culture);

var dt1 = new DateTime(2012,02,29);
dt1.Dump();
 
var dt2 = dt1.AddYears(-1911);
dt2.Dump();

var taiwanCalendar = new System.Globalization.TaiwanCalendar();
var result = string.Format("{0}/{1}/{2}",taiwanCalendar.GetYear(dt1),dt1.Month,dt1.Day);
result.Dump();