使用java实现简单的日期计算,可以通过自定义日期类来实现,具体实现如下:

一、Date自定义类

在自定义Date类中,创建year、month、days的私有属性代表日期的年、月、日。并创建Getter、Setter方法以及构造方法,在eclipse中可以通过alt+shift+s快捷键打开源码,并选择生成Getter和Setter,方法截图附在最后。在Date类中通过calculate()方法将传入的日期和当前对象的日期进行比对。通过proper()方法将验证日期的正确性,月份为1-12月,日期为1-N(N为当前月份的最大天数)代码如下:

public class Date {private int year;//年份private int month;//月份private int days;//日期//    有参构造函数public Date(int year, int month, int days) {super();this.year = year;this.month = month;this.days = days;}//   无参构造函数public Date() {super();}
//  Setter和Getter方法public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDays() {return days;}public void setDays(int days) {this.days = days;}public int calculate(int newYear,int newMonth,int newDays) {int ans = 0;//相差日期int months[] = {0,31,28,31,30,31,30,31,31,30,31,30};//月份所含日期int oldAllDays = 0;//第一个年份从一月一日开始统计的日期int newAllDays = 0;//第二个年份从一月一日开始统计的日期//        第一个年份到第二个年份中间所有的日期
//      闰年为366天,平年为365天while(this.year < newYear) {if((this.year % 4 == 0 && this.year % 100 != 0) || this.year % 400 == 0) {ans += 366;}else {ans += 365;}this.year++;}//     统计第一个年份所经过的日期for (int i = 0; i < this.month; i++) {
//          当前年若为闰年则将二月改为29天if((this.year % 4 == 0 && this.year % 100 != 0) || this.year % 400 == 0) {months[2] = 29;}else {months[2] = 28;}oldAllDays += months[i];}oldAllDays += this.days;//      统计第二个年份所经过的日期for (int i = 0; i < newMonth; i++) {
//          当前年若为闰年则将二月改为29天if((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0) {months[2] = 29;}else {months[2] = 28;}newAllDays += months[i];}newAllDays += newDays;return ans - oldAllDays + newAllDays;}//   检查日期的正确性public boolean proper() {int months[] = {31,28,31,30,31,30,31,31,30,31,30,31};//每个月份所含日期//     当年份为闰年时,二月即下标为1的位置改为29天if((this.year % 4 == 0 && this.year % 100 != 0) || this.year % 400 == 0) {months[1] = 29;}if(this.month > 12 || this.month < 1) {//当输入月份小于1或者大于12时返回falsereturn false;}else if(this.days > months[this.month - 1] || this.days < 1 ) {//当输入日期小于1或者大于当前月最大日期时返回falsereturn false;}return true;}
}

如果要对年份做出正确判断,还可以在月份判断前加上年份的范围判断,min和max代表需要规范年份范围的下限和上限,代码如下:

if(this.year < min || this.year > max) {return false;}

二、Test类

在Test测试类中建立主函数main()进行测试,从键盘获取两个String类型的日期,并将其分割为年、月、日,调用Date类的proper()函数判断输入正误,再调用Date类的calculate()方法获得计算结果,并打印。具体代码如下:

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input = new Scanner(System.in);boolean flag1 = true;//控制第一个日期的循环输入boolean flag2 = true;//控制第二个日期的循环输入Date date1 = new Date();//创建一个Date类的对象while(flag1) {
//          从键盘接收第一个日期System.out.println("请输入一个过去的日期(xxxx-xx-xx):");String oldTime = input.next();//         通过正则表达式检验输入日期格式时候正确if(!oldTime.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}")) {System.out.println("输入格式错误!");continue;}
//          将获得的日期通过“-”进行截取String[] oldTimes = oldTime.split("-");//         将截取的年份、月份、日期取出并强制转化为int类型int oldYear = Integer.parseInt(oldTimes[0]);int oldMonth = Integer.parseInt(oldTimes[1]);int oldDays = Integer.parseInt(oldTimes[2]);//         通过Setter注入为对象属性添加值date1.setYear(oldYear);date1.setMonth(oldMonth);date1.setDays(oldDays);//         检查属性值得合法性if(!date1.proper()) {System.out.println("输入错误!");continue;}flag1 = false;}Date date2 = new Date();//创建第二个对象while(flag2) {
//          从键盘接收第二个日期System.out.println("请输入当前日期(xxxx-xx-xx):");String newTime = input.next();if(!newTime.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}")) {System.out.println("输入格式错误!");continue;}String[] newTimes = newTime.split("-");int newYear = Integer.parseInt(newTimes[0]);int newMonth = Integer.parseInt(newTimes[1]);int newDays = Integer.parseInt(newTimes[2]);date2.setYear(newYear);date2.setMonth(newMonth);date2.setDays(newDays);if(!date2.proper()) {System.out.println("输入错误!");continue;}flag2 = false;}
//      调用Date类的calculate方法计算输入日期与当前对象的相差日期int days = date1.calculate(date2.getYear(), date2.getMonth(), date2.getDays());
//      打印输入结果System.out.println("两个日期相隔" + days + "天");}}

上述代码中,对输入的日期通过正则表达式进行了格式规范,为xxxx-xx-xx。在通过split("-")方法对输入的日期通过“-”进行分割,储存在一个字符串数组中,然后使用int的封装类中的parseInt()方法分别对字符串数组中的字符串进行强制转换,最后获得Date类需要的年、月、日。两个while循环控制两个输入日期,输入正确则跳出循环,否则重新输入。通过创建boolean类型的变量控制循环体,错误则通过continue直接进入下一轮循环,否则执行到最后改变boolean的值跳出循环体。

三、运行结果

输入错误时运行结果如下图所示

 输入正确格式及日期运行结果如下图所示

四、总结

1.Setter、Getter方法及构造方法

在自定义类中,如果想调用private(私有)的成员变量,可以通过Getter、Setter的方法。

快键键Alt+shift+s,并选择生成Setter和Getter,可以一键生成Getter和Setter方法。

除此以外,还可以选择使用字段生成构造函数生成构造函数

选择构造函数需要的参数,点击生成,如果都不选择,则为无参构造函数。

2.正则表达式

在java中如果要对输入字符串进行格式或者内容的验证,可以通过正则表达进行验证。在上述代码中,本人只使用了oldTime.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}")对输入的日期进行格式验证,仅是为了方便字符串分割,如有需要还能直接通过正则表达式验证日期输入的正确性。

Java实现简单日期计算功能相关推荐

  1. Java 根据生日日期计算距离生日还有多少天(工具类)

    已知生日日期,用Java实现计算距离生日还有多少天: // 计算距离生日还有多少天 public class Tool {/*** 计算距离生日还有多少天 * @param addtime:生日日期* ...

  2. java实现简单的日历功能

    在工作台输入日期类型的字符串,然后打印出对应的日期的日历. package demo;import java.text.DateFormat; import java.text.ParseExcept ...

  3. Java给定公历日期计算相应农历/阴历日期

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  4. JAVA实现简单的记事本功能

    用JAVA简单的实现了一下记事本的功能. 代码附在下面,大神请绕路,小白看过来! 注释写的我觉得够明白,不用解释了吧! 有问题的留言吧! package notepad;import java.io. ...

  5. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  6. java中根据日期计算哪一个季度

    这里用到hutool工具类,所以要导入相应的jar包 <dependency><groupId>cn.hutool</groupId><artifactId& ...

  7. 日期计算excel_在Excel中计算日期范围内的项目

    日期计算excel If you have a list on your Excel worksheet, and a date in each row, you can use a formula ...

  8. Java 周日期计算工具,获取当前第几周,按周数获取周一至周日,按日期获取周一至周日

    记一个自己写的工具类: 1.按时间获取当前第几周 getzs 3.按日期获取周一至周日getgetBetweenDates2 4.按年份跟周数获取周一至周日 getgetBetweenDates3 结 ...

  9. java简单atm_Java实现简单银行ATM功能

    本文实例为大家分享了Java实现简单银行ATM功能的具体代码,供大家参考,具体内容如下 实现功能 1.用户需要通过输入银行卡号和密码才能进入ATM系统 2.用户可以在ATM中实现取款.存款.转账.余额 ...

最新文章

  1. 机器学习模型的超参数优化 | 原力计划
  2. 【转】Mac下安装和配置Redis
  3. SpringCloud 01_单体应用到分布式系统演变过程
  4. android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探
  5. 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
  6. 遭遇棘手 交接_Librosa的城市声音分类-棘手的交叉验证
  7. 用计算机探索规律反思,用计算器探索规律教学反思
  8. oracle 11g初始段大小,Oracle 11g配置调优,一般需要注意哪些方面呢?
  9. 题解 LGOJ P4168 【[Violet]蒲公英】
  10. 如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录...
  11. day47 Pyhton 数据库Mysql 04
  12. [UWP]理解ControlTemplate中的VisualTransition
  13. 复制集结合分片架构搭建以及监控
  14. springboot幼儿园幼儿基本信息管理系统毕业设计源码201126
  15. 扇贝计算机英语单词,扇贝英语单词
  16. 阿里小蜜:语音识别、语义分析、深度学习在手机淘宝的实战分享
  17. Unity Shader - 板砖日志 - 简单的树、草 等植物的 随风飘扬 动画
  18. 哈佛国际评论学术写作挑战赛介绍
  19. 超长浮点数据到科学计数法的转换
  20. iOS app脚手架

热门文章

  1. 知人者智,自知者明——战胜自己才最强大(拥有一颗强大的内心,能量爆棚的内在灵魂)...
  2. SAAS 技术栈回顾
  3. javaweb之c3p0连接池(c3p0-config.xml的写法)
  4. Win10禁用管理员帐户后无法进入的两种解决方法
  5. Dynamics CRM IFD部署后延长系统注销时间
  6. Android Studio 如何查看Sqlite数据文件
  7. 加拿大计算机工程研究生,加拿大电子与计算机工程研究生
  8. css 剪辑图片_css剪裁GIF背景图片动画特效
  9. ORAN C平面协议的元素
  10. 双控 嵌入式. linux,大华 DH-ESS6024S-F 专业SAN磁盘阵列 网络智能存储服务器