应用场景:
1、已知用户A的出生日期和用户A产生某条记录时的记录日期;
2、需要同时显示用户A产生记录时的年龄和当前年龄。
结构分层:
1、UI界面交互类(伪代码)
2、年龄计算工具类
3、日期处理工具类
一、UI界面交互类(伪代码)
/// <summary> /// 年龄计算工具 /// </summary> CalculateAgeCls m_AgeCls = new CalculateAgeCls(); private void ShowTwoAge() { DateTime recordTime;//记录日期 DateTime birthday; //出生日期 //此处省略recordTime和birthday的取值 //界面显示:记录时年龄 this.txtAgeOfRecord.Text = this.m_AgeCls.GetAgeString(birthday, recordTime); //界面显示:当前年龄 this.txtAgeOfCurrent.Text = this.m_AgeCls.GetAgeString(birthday); }
二、年龄计算工具类
using System; using System.Collections.Generic; using System.Text; namespace Test { /// <summary> /// 年龄计算工具类 /// 由两个日期参数计算出相对年龄字符串 /// </summary> public class CalculateAgeCls { private DateTime firstDateTime; private DateTime secondDateTime; /// <summary> /// 第一个日期参数:靠前 /// </summary> public DateTime FirstDateTime { get { return firstDateTime; } set { firstDateTime = value; } } /// <summary> /// 第二个日期参数:靠后 /// </summary> public DateTime SecondDateTime { get { return secondDateTime; } set { secondDateTime = value; } } /// <summary> /// 日期处理工具类 /// </summary> DateTimeUtilitiesCls m_DtCls = new DateTimeUtilitiesCls(); /// <summary> /// 获得年龄字符串:当前年龄 /// 返回:xx岁xx月xx天 /// </summary> public string GetAgeString(DateTime p_FirstDateTime) { this.FirstDateTime = p_FirstDateTime; this.SecondDateTime = DateTime.Now; return this.CalculateAgeString(); } /// <summary> /// 获得年龄字符串:某时间段年龄 /// 返回:xx岁xx月xx天 /// </summary> public string GetAgeString(DateTime p_FirstDateTime, DateTime p_SecondDateTime) { this.FirstDateTime = p_FirstDateTime; this.SecondDateTime = p_SecondDateTime; return this.CalculateAgeString(); } /// <summary> /// 计算年龄字符串 /// 返回:xx岁xx月xx天 /// </summary> private string CalculateAgeString() { string result = string.Empty; int year, month, day;//定义:年、月、日 //计算:天 day = this.SecondDateTime.Day - this.FirstDateTime.Day; if (day < 0) { //上个月天数 int daysOfLastMont = this.m_DtCls.GetDaysOfLastMonth(this.SecondDateTime); day += daysOfLastMont; this.SecondDateTime.AddMonths(-1);//借1个月 } //计算:月 month = this.SecondDateTime.Month - this.FirstDateTime.Month; if (month < 0) { month += 12; this.SecondDateTime.AddYears(-1);//借1年 } //计算:年 year = this.SecondDateTime.Year - this.FirstDateTime.Year; //返回结果格式化 result = string.Format("{0}岁{1}月{2}天", year, month, day); return result; } } }
三、日期处理工具类
using System; using System.Collections.Generic; using System.Text; namespace Test { /// <summary> /// 日期处理工具类 /// </summary> public class DateTimeUtilitiesCls { /// <summary> /// 获取上个月的天数 /// </summary> public int GetDaysOfLastMonth(DateTime p_DateTime) { int lastMonth;//上个月 int curMonth = p_DateTime.Month;//当前月 //判断:若当前月为1月,上个月为12月 if (curMonth == 1) { lastMonth = 12; } else { lastMonth = curMonth - 1; } //返回结果 return this.GetDaysOfMonth(p_DateTime.Year, lastMonth); } /// <summary> /// 获取下个月的天数 /// </summary> public int GetDaysOfNextMonth(DateTime p_DateTime) { int nextMonth;//下个月 int curMonth = p_DateTime.Month;//当前月 //判断:若当前月为12月,下个月为1月 if (curMonth == 12) { nextMonth = 1; } else { nextMonth = curMonth + 1; } //返回结果 return this.GetDaysOfMonth(p_DateTime.Year, nextMonth); } /// <summary> /// 获取某月的天数 /// 若参数错误,返回-1 /// </summary> /// <param name="p_DateTime">具体的日期参数</param> public int GetDaysOfMonth(DateTime p_DateTime) { return this.GetDaysOfMonth(p_DateTime.Year, p_DateTime.Month); } /// <summary> /// 获取某月的天数 /// 若参数错误,返回-1 /// </summary> /// <param name="p_Year">年份</param> /// <param name="p_Month">月份</param> public int GetDaysOfMonth(int p_Year, int p_Month) { //返回结果 int result; //判断是否为闰年 bool isLeapYear = DateTime.IsLeapYear(p_Year); //遍历并给结果赋值 switch (p_Month) { //1、3、5、7、8、10、12这几个月=31天 case 1: case 3: case 5: case 7: case 8: case 10: case 12: result = 31; break; //4、6、9、11这几个月=30天 case 4: case 6: case 9: case 11: result = 30; break; //2月,闰年=29天,非闰年=28天 case 2: if (isLeapYear) { result = 29; } else { result = 28; } break; default: result = -1; break; } return result; } } }
小弟才疏学浅,难免会有错误,若您发现了请及时指出,谢谢!
写此文只为记录编程过程中积攒的思想与经验,若您有更好的思路希望您能给我留言,谢谢啦!~