C#月数计算器(主要用于社保、医保缴费月数计算)

news2024/11/28 20:41:21

1、为什么做这个?

  工作中,经常需要计算参保人社保、医保缴费月数,之前都是在Excel中写一个DATEDIF公式,修改单元格中的日期,计算间隔的月数,公式如下:

=DATEDIF(起始日期, 终止日期, 返回类型) 

4bda0c55042e414a8f294d58690afc28.jpeg

或者

a44fb3d1c74447f5a65e0a7a9b4154cf.jpeg

   看起来,这样做也挺方便,但每次录入前,需要用鼠标点击相应单元格,清除内容,录入……计算得多了,仍然感觉很麻烦,于是,决心做一个“计算器”。

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、绘制界面

27fdb3d683f1489aae5b58efab6c7e92.jpeg

  界面分为上下两部分,上面是按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

d452f57f3f57477f82a758431bfbe905.gif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT第二讲

思维导图 完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中 loginscuueed.h #ifndef LOGINSUCCEED_H #define LOGINSUCCEED_H#include <QWidget>namespace Ui { class loginSucceed; }class loginSucceed : public QWidget {…

android数据的储存、文件的储存、SharedPreferences储存、SQLite的基本用法

一、文件的储存 1、将数据储存到文件中 Context类中提供了openfileOutput()方法&#xff0c;用来获取一个文件流&#xff0c;这个方法接收两个参数&#xff0c;第一个参数是文件名&#xff0c;在文件创建的时候使用的就是这个名称&#xff0c;注意这里指定的文件名不可以包含…

白话机器学习笔记(一)学习回归

最小二乘法 定义模型 表达式&#xff1a; f θ ( x ) θ 0 θ 1 x f_\theta(x)\theta_0\theta_1x fθ​(x)θ0​θ1​x &#xff08;常用 θ \theta θ表示未知数、 f θ ( x ) f_\theta(x) fθ​(x)表示含有参数 θ \theta θ并且和变量 x x x相关的函数&#xff09; 目标…

【每日一题】—— D. Prefix Permutation Sums (Codeforces Round 888 (Div. 3))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

三自由度PUMA机器人非线性控制研究(Matlab代码、Simulink仿真实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink仿真实现 &#x1f4a5;1 概述 针对三自由度PUMA560机器人的控制问题&#xff0c;可以使用三种不同的非线性控制算法&#xff1a;计算扭矩控制、滑模控制和反步…

RL 实践(5)—— 二维滚球环境【REINFORCE Actor-Critic】

本文介绍如何用 REINFORCE 和 Actor-Critic 这两个策略梯度方法解二维滚球问题参考&#xff1a;《动手学强化学习》完整代码下载&#xff1a;6_[Gym Custom] RollingBall (REINFORCE and Actor-Critic) 文章目录 1. 二维滚球环境2. 策略梯度方法2.1 策略学习目标2.2 策略梯度定…

石子合并(区间dp模板)

题目描述&#xff1a; dp分析&#xff1a; 解题代码&#xff1a; #include<iostream> using namespace std;const int N1e36;int f[N][N]; int a[N]; int s[N];int main(){int n;cin>>n;for(int i1;i<n;i){scanf("%d",&s[i]);s[i]s[i-1];//前缀和…

使用fastjson错误

说明&#xff1a;使用fastjson时&#xff0c;对象解析不成功&#xff0c;一直报错&#xff0c;但是json格式没有错&#xff1b; 错误信息&#xff1a;Method threw ‘com.alibaba.fastjson.JSONException’ exception. json数据是正确的 分析&#xff1a;注意看&#xff0c;fa…

【用IDEA基于Scala2.12.17开发Spark 3.4.1 项目】

目录 使用IDEA创建Spark项目设置sbt依赖创建Spark 项目结构新建Scala代码 使用IDEA创建Spark项目 打开IDEA后选址新建项目 选址sbt选项 配置JDK debug 解决方案 相关的依赖下载出问题多的话&#xff0c;可以关闭idea&#xff0c;重启再等等即可。 设置sbt依赖 将sbt…

数据安全问题防不胜防?教你使用铁威马的321原则

无论是勒索病毒的袭击&#xff0c;还是硬件损坏、人为误删等原因造成的数据丢失的意外让我们防不胜防。为此&#xff0c;我们时常建议大家尤其是企业通过【3-2-1备份原则】的数据保护策略来备份数据&#xff0c;以便在数据受损失时&#xff0c;能快速地从备份介质中完整地恢复数…

git相关

gerrit用户指南&#xff1a; 资料&#xff1a;Gerrit 用户指南 gerrit-user-guide 上述有介绍如何review&#xff0c;review并非修改代码之后如何重新提交等操作 jenkins介绍 Jenkins详细教程 - 知乎 一、jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界…

vite的介绍

Vite&#xff08;法语意为 "快速的"&#xff0c;发音 /vit/&#xff0c;发音同 "veet")是一种新型前端构建工具 优势 &#x1f4a1; 极速的服务启动&#xff0c;使用原生 ESM 文件&#xff0c;无需打包 ⚡️ 轻量快速的热重载&#xff0c;始终极快的模块…

Centos7.6安装RocketMQ4.9.2并配置开机自启

1、下载RocketMQ 编译后的压缩包 wget https://dlcdn.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip2、解压 unzip rocketmq-all-4.9.2-bin-release.zip3、进入解压文件夹 cd rocketmq-all-4.9.2/4、编辑配置文件/usr/local/rocketmq/rocketmq-all-4.9.4-…

Spring Boot 拦截器实现:登录验证 统一异常处理 返回数据规范化

学习 Spring 和 servlet 初期&#xff0c;我们在判断用户身份时&#xff0c;都是在每个方法中获取会话、获取对象&#xff0c;这种方式冗余度高&#xff0c;增加代码复杂度&#xff0c;维护成本也高&#xff0c;因此想到可以使用 AOP 来实现一个公共的方法&#xff0c;这个公共…

Android 自定义跳转到系统 Settings Fragment 的 Intent

以跳转到蓝牙控制面板为例&#xff0c;控制面板如图所示&#xff1a; 其 Fragment 所在的位置是&#xff1a; packages/apps/Settings/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java 第一步 要在 Settings的主要 Activity 中定义继承同一个父类…

通达信波段王指标公式_通达信公式

使用说明&#xff1a;1、买点&#xff1a;多空分界线变红后出现波段买为做多信号&#xff0c;中间出现波段卖信号为杂波可以不考虑&#xff0c;再结合逃顶信号进行卖出操作&#xff0c;如果没有出现逃顶信号&#xff0c;则可以等多空分界线变绿后结合波段卖信号综合做出判断。2…

基于proteus的纯模拟病房呼叫系统

摘要&#xff1a;无线的病房呼叫系统将病人的呼叫请求迅速传递给医护者&#xff0c;减少了信息传递的过程性&#xff0c;病人无需等待医护巡查才可求助&#xff0c;增加了便捷性与即时性&#xff1b;此外也减轻一定的工作量&#xff0c;加强服务的效率。本文基于proteus软件进行…

selenium 启动常用浏览器驱动方式

一.启动 Chrome 浏览器 方式一&#xff1a; // 驱动路径的 File File file new File("src/main/resources/drivers/chromedriver-win32.exe"); // 设置系统属性&#xff0c;setProperty() 中两个参数分别是驱动名和 file 绝对路径 System.setProperty("webdr…

如何在Mkdocs里自定义字体(霞鹜文楷)

网站目前在用的字体&#xff1a;霞鹜文楷 想必你可以直观的从我的网站&#xff0c;感受到这款字体的美观程度。 以下是摘录的部分字体官方介绍文档 注意事项 添字请在 Issue #33 反馈&#xff0c;字形调整请在 Issue #14 反馈&#xff0c;不要另开议题&#xff0c;以便于整理。…

SpringBoot——持久化技术

简单介绍 在之前我们使用的数据层持久化技术使用的是MyBatis或者是MyBatis-plus&#xff0c;其实都是一样的。在使用之前&#xff0c;我们要导入对应的坐标&#xff0c;然后配置MyBatis特有的配置&#xff0c;比如说Mapper接口&#xff0c;或者XML配置文件&#xff0c;那么除了…