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
}