C#关于精确年龄的算法(精确到天)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#关于精确年龄的算法(精确到天)

C#关于精确年龄的算法(精确到天)

 2013/12/11 16:09:08  ExDevilLee  博客园  我要评论(0)
  • 摘要:应用场景:1、已知用户A的出生日期和用户A产生某条记录时的记录日期;2、需要同时显示用户A产生记录时的年龄和当前年龄。结构分层:1、UI界面交互类(伪代码)2、年龄计算工具类3、日期处理工具类一、UI界面交互类(伪代码)///<summary>///年龄计算工具///</summary>CalculateAgeClsm_AgeCls=newCalculateAgeCls();privatevoidShowTwoAge(){DateTimerecordTime
  • 标签:C# 年龄 算法

应用场景:

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;
        }
    }
}

小弟才疏学浅,难免会有错误,若您发现了请及时指出,谢谢!

写此文只为记录编程过程中积攒的思想与经验,若您有更好的思路希望您能给我留言,谢谢啦!~

发表评论
用户名: 匿名