在開發報表、查詢或商務邏輯時,經常需要預設各種日期範圍(如「本年度」、「本季度」、「本月」、「本週」等)。C# 內建的 DateTime 結構功能強大,善用其屬性與方法可大幅簡化日期計算程式碼。本文整理常見的日期範圍計算模式,供開發者快速參考。
// 今天
DateTime.Now.Date.ToShortDateString();
// 昨天
DateTime.Now.AddDays(-1).ToShortDateString();
// 明天
DateTime.Now.AddDays(1).ToShortDateString();
// 取得今天是星期幾(0=週日, 6=週六)
int dayOfWeek = (int)DateTime.Now.DayOfWeek;
// 本週第一天(週日)
DateTime.Now.AddDays(-dayOfWeek).ToShortDateString();
// 本週最後一天(週六)
DateTime.Now.AddDays(6 - dayOfWeek).ToShortDateString();
// 中文星期顯示技巧
string[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string todayCh = weekDays[dayOfWeek];
// 上週第一天
DateTime.Now.AddDays(-dayOfWeek - 7).ToShortDateString();
// 上週最後一天
DateTime.Now.AddDays(6 - dayOfWeek - 7).ToShortDateString();
// 下週第一天
DateTime.Now.AddDays(-dayOfWeek + 7).ToShortDateString();
// 下週最後一天
DateTime.Now.AddDays(6 - dayOfWeek + 7).ToShortDateString();
// 寫法一:字串拼接
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")); // 月初
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1); // 月底
// 寫法二:使用 DateTime 建構子(效能較佳)
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); // 月初
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1).AddDays(-1); // 月底
// 上月初
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1);
// 上月底
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1);
// 下月初
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1);
// 下月底
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1);
// 7 天後
DateTime.Now.AddDays(7).ToShortDateString();
// 7 天前
DateTime.Now.AddDays(-7).ToShortDateString();
// 年初
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01"));
// 年底
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1);
// 上年初
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1);
// 上年底
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1);
// 下年初
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1);
// 下年底
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1);
int month = DateTime.Now.Month;
// 本季度第一個月
int firstMonthOfQuarter = month - (month - 1) % 3;
// 本季度第一天
DateTime.Now.AddMonths(-((month - 1) % 3)).ToString("yyyy-MM-01");
// 本季度最後一天(下季度第一天減一天)
DateTime.Parse(
DateTime.Now.AddMonths(3 - ((month - 1) % 3)).ToString("yyyy-MM-01")
).AddDays(-1).ToShortDateString();
// 下季度第一天
DateTime.Now.AddMonths(3 - ((month - 1) % 3)).ToString("yyyy-MM-01");
// 下季度最後一天
DateTime.Parse(
DateTime.Now.AddMonths(6 - ((month - 1) % 3)).ToString("yyyy-MM-01")
).AddDays(-1).ToShortDateString();
// 上季度第一天
DateTime.Now.AddMonths(-3 - ((month - 1) % 3)).ToString("yyyy-MM-01");
// 上季度最後一天
DateTime.Parse(
DateTime.Now.AddMonths(-((month - 1) % 3)).ToString("yyyy-MM-01")
).AddDays(-1).ToShortDateString();
DateTime 建構子與 AddDays/AddMonths/AddYears 方法,避免字串解析的效能損耗。DateTimeHelper),提高程式碼復用性與可維護性。ToShortDateString 輸出格式的影響,正式環境建議明確指定格式字串(如 yyyy-MM-dd)。