再来一个计算工龄的函数,根据入厂时间来计算,这里用到自己在项目中使用的一个来说明,需求是根据入厂时间来计算工龄和社保工龄。
社保工龄:需要计算到小数点后一位的形式来保存,相当于精确到月,没到一个月不能算一个月。
工龄:就计算当今天为止,和入厂时间比较,具体的工作年限,整数,这个只精确到年,不到一年不能算一年(这个和年龄差不多,不过和社保工龄写到一起的,就一起计算了)。
函数如下:
- #region 计算工龄
- /// <summary>
- /// 计算工龄和社保工龄
- /// </summary>
- /// <param name="EntryDay">入职时间</param>
- /// <param name="isSoc">是否为社保工龄(true为社保工龄,false为工龄)</param>
- /// <returns></returns>
- public static string CaculateWorkAge(string entryday,bool issoc)
- {
- string strWorkAge = null;
- if(entryday == "")
- {
- strWorkAge = "0";
- }
- else
- {
- DateTime dtEntryDay = DateTime.Parse(entryday);
- DateTime dtNow = DateTime.Now;
- int iYear = 0;//年
- int iMonth = 0;//月
- int allMonth = 0;//年月转换成的总的月数
- if(dtNow.Year > dtEntryDay.Year)//现在的年入职生年大
- {
- iYear += dtNow.Year - dtEntryDay.Year - 1;
- if(dtNow.Month > dtEntryDay.Month)//现在的月比入职月大
- {
- ++ iYear;
- iMonth += dtNow.Month - dtEntryDay.Month;
- }
- else if(dtNow.Month == dtEntryDay.Month)//现在的月与入职月一样
- {
- if(dtNow.Day >= dtEntryDay.Day)//现在的日比入职日大
- {
- ++ iYear;
- }
- else//现在的日比入职日小
- {
- iMonth += 11;
- }
- }
- else//现在的月比入职小
- {
- if(dtNow.Day >= dtEntryDay.Day)//现在的日比出入职大
- {
- iMonth += 12 + dtNow.Month - dtEntryDay.Month;
- }
- else//现在的日比出入职小
- {
- iMonth += 11 + dtNow.Month - dtEntryDay.Month;
- }
- }
- }
- else if(dtNow.Year == dtEntryDay.Year)
- {
- iMonth += dtNow.Month - dtEntryDay.Month;
- }
- allMonth = iYear * 12 + iMonth;//总的月数
- if(issoc)//社保工龄
- {
- strWorkAge = ((double)allMonth / 12.0).ToString("F1");
- }
- else//工龄
- {
- strWorkAge = ((int)allMonth / 12).ToString();
- }
- }
- return strWorkAge;
- }
- #endregion
这里是用计算出总的月数来除以12,因为每年都是12个月,这样计算很方便,相反,计算到总天数就比较麻烦了,除数就不好确定了,有的年是365或366,所以,用月比较好。思路就是这样,计算嘛,很简单,看下就能理解了。