public static class DateTimeExtensions { /// <summary> /// 获取格式化日期,默认为 yyyy-mm-dd h:m:s /// yyyy:数字年份,m/mm数字月,d/dd数字日 /// YYYY:汉字年份,如二〇一二,M/MM汉字月,D/DD汉字日 /// </summary> /// <param name="dt">要处理的日期时间</param> /// <param name="sFormat">格式化字符串,以ymd,hms,W为主要变量</param> /// <returns></returns> public static string Format(this DateTime dt,string sFormat) { var yyyy = dt.Year.ToString(CultureInfo.InvariantCulture); var m = dt.Month; var mm = m.ToString().PadLeft(2, '0'); var d = dt.Day; var dd = d.ToString().PadLeft(2, '0'); var h = dt.Hour; var hh = h.ToString().PadLeft(2, '0'); var mi = dt.Minute; var mmi = mi.ToString().PadLeft(2, '0'); var s = dt.Second; var ss = s.ToString().PadLeft(2, '0'); string w = dt.DayOfWeek.ToString(); string wcn; //中国农历 string nl = dt.GetChineseDate(); w = GetWeekNum(w); wcn = GetWeekString(w); string nowStr = sFormat.Replace("yyyy", yyyy) .Replace("mm", mm) .Replace("dd", dd) .Replace("hh", hh) .Replace("mm", mmi) .Replace("ss", ss) .Replace("W", wcn) .Replace("M", m.ToString()) .Replace("D", d.ToString()) .Replace("h", h.ToString()) .Replace("m", mi.ToString()) .Replace("s", s.ToString()) .Replace("NL", nl); return nowStr; } /// <summary> /// 转换为农历年 /// </summary> /// <param name="date"></param> /// <returns></returns> public static string GetChineseDate(this DateTime date) { var cnDate = new ChineseLunisolarCalendar(); string[] arrMonth = { "", "正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月" }; string[] arrDay = { "", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十" }; string[] arrYear = { "", "甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛己", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸丑", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥" }; var lYear = cnDate.GetYear(date); var sYear = arrYear[cnDate.GetSexagenaryYear(date)]; var lMonth = cnDate.GetMonth(date); var lDay = cnDate.GetDayOfMonth(date); //获取第几个月是闰月,等于0表示本年无闰月 var leapMonth = cnDate.GetLeapMonth(lYear); var sMonth = arrMonth[lMonth]; //如果今年有闰月 if (leapMonth > 0) { //闰月数等于当前月份 sMonth = lMonth == leapMonth ? string.Format("闰{0}", arrMonth[lMonth - 1]) : sMonth; sMonth = lMonth > leapMonth ? arrMonth[lMonth - 1] : sMonth; } return string.Format("{0}年{1}{2}", sYear, sMonth, arrDay[lDay]); } /// <summary> /// 日期间隔计算,结果单位与flag相同 /// flag:year/month/day/hour/minute/second /// </summary> /// <param name="d1"></param> /// <param name="d2"></param> /// <param name="flag"></param> /// <returns></returns> public static int DateDiff(this DateTime d1,DateTime d2,string flag) { var iR = 0; switch (flag.ToLower()) { case "year": iR = d2.Year - d1.Year; break; case "month": iR = (d2.Year - d1.Year) * 12 + (d2.Month - d1.Month); break; case "day": iR = (int)(d2 - d1).TotalDays; break; case "hour": iR = (int)(d2 - d1).TotalHours; break; case "minute": iR = (int)(d2 - d1).TotalMinutes; break; case "second": iR = (int)(d2 - d1).TotalSeconds; break; } return iR; } /// <summary> /// 获取日期月的最大天数 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static int DaysInMonth(this DateTime dt) { return DateTime.DaysInMonth(dt.Year, dt.Month); } #region 私有 private static string GetWeekString(string w) { string wcn; switch (w) { case "6": wcn = "星期日"; break; case "0": wcn = "星期一"; break; case "1": wcn = "星期二"; break; case "2": wcn = "星期三"; break; case "3": wcn = "星期四"; break; case "4": wcn = "星期五"; break; case "5": wcn = "星期六"; break; default: wcn = "星期无"; break; } return wcn; } /// <summary> /// 将英文周描述转为数字型 /// </summary> /// <param name="weekName"></param> /// <returns></returns> public static string GetWeekNum(string weekName) { string iR = "1"; switch (weekName) { case "Monday": iR = "0"; break; case "Tuesday": iR = "1"; break; case "Wednesday": iR = "2"; break; case "Thursday": iR = "3"; break; case "Friday": iR = "4"; break; case "Saturday": iR = "5"; break; case "Sunday": iR = "6"; break; } return iR; } #endregion }