1、为什么做这个?
工作中,经常需要计算参保人社保、医保缴费月数,之前都是在Excel中写一个DATEDIF公式,修改单元格中的日期,计算间隔的月数,公式如下:
=DATEDIF(起始日期, 终止日期, 返回类型)
或者
看起来,这样做也挺方便,但每次录入前,需要用鼠标点击相应单元格,清除内容,录入……计算得多了,仍然感觉很麻烦,于是,决心做一个“计算器”。
2、制作思路
这个计算器,主打一个“方便”,所以界面要简洁,功能要强大,功能主要做2个:
- 根据2个日期,计算相距的月数
- 根据1个日期,计算其之前或之后n个月的日期
在这里,我设置了3种计算方式:共计、相差、间隔,在工作中,“共计”模式用的最多。
- 共计:从年月a数到年月b,一共有多少个月,例如从2008年1月至2008年9月,计算结果为9;
- 相差:从年月a到年月b,差着几个月,例如从2008年1月至2008年9月,计算结果为8;
- 间隔:从年月a到年月b,中间隔着几个月,例如从2008年1月至2008年9月,计算结果为7。
为方便使用,年月a和年月b自动比较大小,录入时无需考虑哪个在前哪个在后。
日期格式:yyyyMM,例如2009年5月,输入为200905。
3、绘制界面
界面分为上下两部分,上面是按2个【年月】计算【月数】,下面是按【年月一】+【月数】计算【年月二】。
计算方式那里用了ComboBox,下拉选择,年月输入框使用的TextBox,后续计算时要对有效性进行校验。
为方便操作,对控件的OnKeyPress事件进行了设置,实现用回车键切换文本框,对窗体的CancelButton进行了设置,实现用ESC键清空内容。
4、功能实现
直接粘上用到的2个方法
/// <summary>
/// 按【年月一】+【月数】计算【年月二】
/// </summary>
/// <param name="ym1">【年月一】</param>
/// <param name="monthsCount">【月数】</param>
/// <param name="jisuanfangshi">计算方式</param>
/// <param name="Msg">存放错误信息</param>
/// <returns>【年月二】</returns>
private DateTime calMonth(DateTime ym1, int monthsCount, string jisuanfangshi, out string Msg)
{
DateTime dtResult = new DateTime();
try
{
dtResult = ym1.AddMonths(monthsCount);
Msg = "";
}
catch(Exception ex)
{
Msg = ex.Message;
}
return dtResult;
}
/// <summary>
/// 按2个【年月】计算【月数】
/// </summary>
/// <param name="start">【年月一】</param>
/// <param name="end">【年月二】</param>
/// <param name="jisuanfangshi">计算方式</param>
/// <param name="Msg">存放说明信息<</param>
/// <returns>【月数】</returns>
private int cal(DateTime start, DateTime end, string jisuanfangshi, out string Msg)
{
int result = -1;
Msg = "";
if (start > end)
{
DateTime tmpDT = end;
end = start;
start = tmpDT;
}
int endMonth = end.Month;
int startMonth = start.Month;
int endYear = end.Year;
int startYear = start.Year;
if (endMonth < startMonth)
{
endYear -= 1;
endMonth += 12;
}
result = 12 * (endYear - startYear) + endMonth - startMonth;
switch (jisuanfangshi)
{
case "共计":
result += 1;
break;
case "间隔":
result -= 1;
if (result < 0)
{
result = 0;
}
break;
case "相差":
break;
}
if (result > 12)
{
Msg = (result / 12).ToString() + "年" + (result % 12).ToString() + "个月";
}
return result;
}
按日期计算月数
private void btnCal_Click(object sender, EventArgs e)
{
if (!Regex.IsMatch(txtStart.Text, @"^\d{6}$"))
{
MessageBox.Show("起始年月格式{yyyyMM}录入有误!请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
txtStart.Focus();
return;
}
if (!Regex.IsMatch(txtEnd.Text, @"^\d{6}$"))
{
MessageBox.Show("截止年月格式{yyyyMM}录入有误!请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
txtEnd.Focus();
return;
}
try
{
DateTime dt1 = new DateTime(int.Parse(txtStart.Text.Substring(0, 4)), int.Parse(txtStart.Text.Substring(4, 2)), 1);
DateTime dt2 = new DateTime(int.Parse(txtEnd.Text.Substring(0, 4)), int.Parse(txtEnd.Text.Substring(4, 2)), 1);
string info = "";
txtResult.Text = cal(dt1, dt2, cmbCal.Text,out info).ToString();
if (info.Length > 0)
{
lblInfo.Text = "个月 即 " + info;
}
else
{
lblInfo.Text = "个月";
}
}
catch
{
MessageBox.Show("日期转换出错,请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
return;
}
}
按一个日期+月数计算另一个日期
private void btnCalMonth_Click(object sender, EventArgs e)
{
DateTime dtFirst;
try
{
dtFirst = new DateTime(int.Parse(txtYMA.Text.Substring(0, 4)),int.Parse(txtYMA.Text.Substring(4, 2)),1);
}
catch
{
MessageBox.Show("【起始年月】填写有误!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
txtYMA.Focus();
return;
}
if (txtNumYear.Text.Length == 0 && txtNumMonth.Text.Length == 0)
{
MessageBox.Show(cmbCountMonth.Text+"【月数】未填写!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
txtNumYear.Focus();
return;
}
int monthCount = 1;
if (cmbCalMonth.Text == "间隔")
{
monthCount = -1;
}
if (cmbCalMonth.Text == "相差")
{
monthCount = 0;
}
if(Regex.IsMatch(txtNumYear.Text,@"^\d+$"))
{
monthCount-=int.Parse(txtNumYear.Text)*12;
}
if(Regex.IsMatch(txtNumMonth.Text,@"^\d+$"))
{
monthCount-=int.Parse(txtNumMonth.Text);
}
if (cmbCountMonth.Text == "后")
{
monthCount *= -1;
}
DateTime dtResult = dtFirst.AddMonths(monthCount);
txtResultCount.Text = dtResult.ToString("yyyyMM");
}
感兴趣的朋友可以动手做一个,试一下!
下载源码https://download.csdn.net/download/W2KExp/88094039