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

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.mfbz.cn/a/45442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在APP开发中实现无缝用户体验?

我们在日常生活中经常会看到这样一种情况&#xff1a;当我们打开 APP时&#xff0c;有时会出现卡顿、死机的情况&#xff0c;这就是所谓的“死机”现象。在开发 APP时&#xff0c;我们需要考虑用户体验&#xff0c;在用户操作 APP时能够感受到顺畅的使用体验&#xff0c;让用户…

体制内裸辞,她用云端地球实现了自己的乡村梦

追逐田园的“诗与远方” “我最初的梦想&#xff0c;就是有一个亲手打造的、能装进个人喜好的小院子。”为完成自己的梦想&#xff0c;吕春萍毅然放弃了体制内的工作&#xff0c;来到秦岭脚下的桥南镇曹峪村&#xff0c;践行自己的“乡村梦”。 起初&#xff0c;吕春萍做了五…

晚上12点接到面试邀约电话,待业一个月的我却拒绝了....

前言 一位测试朋友最近一直在找工作&#xff0c;前两天刚拒绝了一个面试。那天晚上12点多&#xff0c;他接到一个HR的面试电话&#xff0c;让他第二天早上10点去公司面试。朋友和HR聊了两句&#xff0c;了解到这位HR经常加班&#xff0c;于是果断拒绝了这个面试。 我还为他可惜…

adnroid 11. 0 Activity启动流程图解

从Launcher到ActivityTaskManager 从ActivityTaskManagerService 到 ApplicationThread 从ApplicationThread到onCreate

docker基本命令学习 | Docker网络、Docker镜像发布

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; docker安装、卸载 docker安装使用 卸载旧版本docker或者环境 [rootiZf8zdcobr3fw7vn0p3538Z /]# yum remove docker \ > docker-client \ >…

【Kafka】消息队列Kafka基础

目录 消息队列简介消息队列的应用场景异步处理系统解耦流量削峰日志处理 消息队列的两种模式点对点模式发布订阅模式 Kafka简介及应用场景Kafka比较其他MQ的优势Kafka目录结构搭建Kafka集群编写Kafka一键启动/关闭脚本 Kafka基础操作创建topic生产消息到Kafka从Kafka消费消息使…

计算机网络最基础知识介绍

OSI和TCP/IP是很基础但又非常重要的知识,很多知识点都是以它们为基础去串联的,作为底层,掌握得越透彻,理解上层时会越顺畅。今天这篇网络基础科普,就是根据OSI层级去逐一展开的。 01 计算机网络基础 01 计算机网络的分类 按照网络的作用范围:广域网(WAN)、城域网(MA…

使用Gin框架搭配WebSocket完成实时聊天

文章目录 前言实时聊天聊天功能测试发送信息 前言 在写项目的时候&#xff0c;需要完成实时聊天的功能&#xff0c;于是简单的学习下WebSocket&#xff0c;想知道WebSocket是什么的小伙伴可以去网上别的地方学习一下。 要实现实时聊天&#xff0c;网上的大部分内容都是Spring…

Python爬虫+数据可视化:分析唯品会商品数据

目录 前言数据来源分析1. 明确需求2. 抓包分析&#xff1a;通过浏览器自带工具: 开发者工具 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据发送请求解析数据保存数据 数据可视化先读取数据泳衣商品性别占比商品品牌分布占比各大品牌商品售价平均价格各…

macOS mysql 8.0 忘记密码

╰─➤ mysql -V mysql Ver 8.0.33 for macos13.3 on arm64 (Homebrew)mysql.server status mysql.server stopskip-grant-tables 启动mysql ─➤ /opt…

通达信有价值的资金流向指标公式-通达信公式

资金流向指标公式&#xff1a; 流通:AMOUNT/VOL; PJJ:DMA((HIGHLOWCLOSE*2)/4,0.9); JJ:REF(EMA(PJJ,3),1); QJJ:VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)); XVL:(IF(CLOSE>OPEN,QJJ*(HIGH-LOW),IF(CLOSE<OPEN,QJJ*(HIGH-OPENCLOSE-LOW),VOL/2))IF(CLOSE>OPEN,0-QJJ*(…

Django框架:使用channels实现websocket,配置和项目实际使用

一、基本配置 依赖包&#xff1a; Django3.2 django-cors-headers3.5.0 redis4.6.0 #操作redis数据库的 channels3.0.0 #websocket channels-redis4.1.0 #通道层需要&#xff0c;依赖redis包项目目录结构&#xff1a; study_websocket --study_websocket --__init__.py --s…

redis 第一章

目录 1.redis 安装部署 2.redis 数据库常用命令 3.总结 1.redis 安装部署 2.redis 数据库常用命令 3.总结 redis&#xff08;远程字典服务器&#xff09;是一个开源的、使用 C 语言编写的 nosql 数据库。redis 基于内存运行并支持持久化&#xff0c;采用 key-value&#xff0…

华为战略方法论:BLM模型之关键任务与依赖关系

内容简介 在 BLM 模型中&#xff0c;执行部分包括四个模块&#xff0c;分别是&#xff1a; 关键任务与依赖关系&#xff1b;组织与绩效&#xff1b;人才&#xff1b;氛围与文化。 详细内容&#xff0c;大家可以参看下面这张图。 这四个模块其实是可以进一步划分成两个关键点…

JavaWeb开发(后端Web开发【一】)

文章目录 前言一、Maven1.Maven概述-介绍1.1.Maven概述-介绍1.2.Maven概述-安装 2.IDEA集成Maven2.1.IDEA集成Maven-配置Maven环境2.2.IDEA集成Maven-创建Maven项目2.3.IDEA集成Maven-导入Maven项目 3.Maven-依赖管理3.1.Maven-依赖管理-依赖配置3.2.Maven-依赖管理-依赖传递3.…

九五从零开始的运维之路(其二十五)

文章目录 前言一、概述二、配置环境及搭建服务1.关闭防火墙、网络图形化工具及SElinux2.配置yum源3.测试网络连通性4.分配磁盘容量5.安装targetcli包6.服务器端进行配置7.客户端 总结 前言 本篇将简述的内容&#xff1a;Linux系统下的ISCSI服务 一、概述 iscsi全称&#xff1…

笔试题:统计字符串中某字符串在其出现的字符个数

笔试题&#xff1a;统计字符串中某一子串的字符个数&#xff1a;例如字符串aabbcd,有aabb:4,ab:2 哈哈&#xff0c;这道题是小编面试音视频龙头企业的笔试题&#xff0c;以下是我写的代码&#xff1a;如果有错误&#xff0c;希望可以指正!!! 解题思路&#xff1a;利用双指针i和…

synchronized 关键字

目录 背景过程历史概念实际应用方法1&#xff1a;放方法名前形成同步方法&#xff1b;方法2&#xff1a;使用同步块修改上面的例子&#xff1b; 应用方法锁住对象&#xff1a;锁住类&#xff1a; 总结 背景 学习并发&#xff0c;为解决并发带来的问题&#xff0c;引入synchron…

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

ES6 (js)

学习了很多vue的视频&#xff0c;还有nuxt的&#xff0c;还是不会。 还是要学ES6 本文的大部分出自小马老师的资料&#xff0c;还有曾大佬的文章 变量&#xff08;Let 和 const&#xff09; 在es6中&#xff0c;多用let 和const 来声明变量类型。因为var 会提前声明&#xff0…
最新文章