[小菜一碟] 使用 C# 將民國日期的字串轉換成西元日期

四年一次會出現的不是只有總統大選,還有 2 月 29 日的問題,程式如果寫得不夠久大概也不會遇到,像今年就有可能會收到像是「113/02/29」、「113年2月29日」這樣的日期字串,在 C# 中如果直接先轉成西元日期的 113/02/29,再加上 1911 年,像這樣:

DateTime.ParseExact("113/02/29", "yyy/MM/dd", null).AddYears(1911);

那我們的程式應該已經爆了,因為西元 113 年沒有 2 月 29 日,關於閏年的問題,在 C# 我們有更優雅的做法。

TaiwanCalendar

直接講解法,我們在 DateTime.Parse() 時,給予 zh-TW 的文化特性,並且把 DateTimeFormatCalendar 換成 TaiwanCalendar,這樣子,只要不是什麼奇形怪狀的格式,大部分的需求都可以滿足。

var twCulture = new System.Globalization.CultureInfo("zh-TW") { DateTimeFormat = { Calendar = new TaiwanCalendar() } };

DateTime.Parse("113/2/29", twCulture).Dump();
DateTime.Parse("113/02/29", twCulture).Dump();
DateTime.Parse("113-2-29", twCulture).Dump();
DateTime.Parse("113-02-29", twCulture).Dump();
DateTime.Parse("113年2月29日", twCulture).Dump();
DateTime.Parse("民國113年2月29日", twCulture).Dump();
DateTime.Parse("中華民國113年2月29日", twCulture).Dump();

另外,TaiwanCalendar 也能單獨使用,比如說,我們想知道今年是民國幾年,就能用 TaiwanCalendar.GetYear() 方法來取得。

var twYear = new TaiwanCalendar().GetYear(DateTime.Now);

今年 2024 年是一個閏年,不知道下一個閏年,會不會有其他關於 C# 處理民國日期閏年的文章出現,但可以肯定的是,一定會有經驗不足的程式設計師在下一個閏年到來之前,持續佈雷,等待不知情的程式維護者踩爆它。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學