一步一步教你使用Java Calendar类进行日期计算

举报
bug菌 发表于 2023/10/18 16:16:32 2023/10/18
【摘要】 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

@[toc]

前言

  在日常开发中,我们常常需要进行日期计算。比如计算两个日期之间的天数、月数,或者给指定日期加上或减去一定的天数。在Java中,我们可以使用Java Calendar类来进行日期计算。本文将从基础开始,一步一步地介绍Java Calendar类的使用方法,带你轻松掌握日期计算技巧。

摘要

本文将介绍以下内容:

  1. Calendar类介绍
  2. 应用场景
  3. 优缺点分析
  4. 如何获取当前日期?
  5. 如何设置日期?
  6. 如何进行日期计算?
  7. Calendar类常用方法介绍
  8. 测试用例

Java Calendar类

概述

  Java Calendar类是一个抽象类,提供了许多用于处理日期和时间的方法。它是日历类的抽象表示,可以将特定的日期转换为Unix时间戳,并进行日期计算。Calendar类是Java日期时间API的一部分,它可以处理从公元1年1月1日到当前日期的所有日期。

应用场景

  由于Java Calendar类是一个抽象类,其提供了对日期和时间进行计算、比较、输出等基本操作的方法,应用场景包括:

  1. 日历应用:可以使用Calendar类来创建一个日历应用程序,展示当前日期、月份、年份、节假日等信息,同时支持用户进行日期调整和日程安排等操作。

  2. 任务调度:Calendar类可以用于实现任务调度功能,例如每周定时执行某个任务、每月执行某个任务等,可以通过设置定时器来实现。

  3. 数据处理:在一些需要进行大量日期运算的数据处理场景中,可以使用Calendar类来计算两个日期之间的间隔、判断两个日期是否相等、比较日期先后顺序等。

  4. 时间转换:在不同的国家和地区中,时间的表示方式不同,例如用12小时制还是24小时制,用AM还是PM表示上午和下午等。使用Calendar类可以很方便地进行时间转换,将日期和时间以指定的格式输出。

  5. … …

优缺点

  Java Calendar类是Java标准库中用于处理日期和时间的类,其优点和缺点如下:

优点:

  1. 提供了丰富的日期和时间操作方法,可以满足多种需求。
  2. 可以处理时区、夏令时等复杂的时间问题。
  3. 可以处理更多的日期时间格式化规则,例如:针对不同区域的不同日期时间格式化规则。

缺点:

  1. Calendar类是一个重量级的类,占用内存较大。
  2. 由于历史原因,Calendar类中存在一些设计缺陷,例如:月份从0开始计数、星期从1开始计数等,这些设计缺陷容易引起程序员的困惑和错误。
  3. Calendar类的API较为繁琐,使用起来比较麻烦。
  4. Calendar类在处理闰秒等特殊情况时存在一些问题,可能会导致程序的不稳定性。

  虽然Java Calendar类提供了强大的日期和时间处理功能,但由于其存在设计缺陷和API复杂等问题,在使用时需要谨慎考虑,并且推荐使用一些开源的日期时间操作库(如Joda-Time库)来替代。

常用方法介绍

  Java中的Calendar类是用于处理日期和时间的抽象类,它提供了很多常用的日期和时间处理方法。

方法 描述
add() 在指定的日期上增加或减少指定的年、月、日、小时、分钟、秒等时间值。
roll() 在指定的日期上增加或减少指定的年、月、日、小时、分钟、秒等时间值,但不会影响到更高的时间单位。
setTime(Date date) 使用给定的Date设置此Calendar的时间
getTime() 获取Calendar对象对应的Date对象。
set(int field, int value) 设置指定的年、月、日、小时、分钟、秒等时间值。
add(int field, int amount) 根据日历规则,将指定的时间量添加或减去给定的日历字段
get(int field) 获取指定的年、月、日、小时、分钟、秒等时间值。
setLenient(boolean lenient) 指定宽松的解析
setTimeZone(TimeZone value) 为此Calendar设置时区。
getActualMinimum() 获取指定时间单位(年、月等)的最小值。
getDisplayName() 获取指定时间单位的显示名称。
getInstance() 获取默认时区的Calendar对象

实例演示

如何获取当前日期?

  我们可以使用getInstance()方法获取一个Calendar对象,该对象表示当前日期和时间。

示例如下:

    //获取当前日期
    public static void getNowDate(){
        Calendar now = Calendar.getInstance();
        System.out.println("当前时间为:" + now.getTime());
    }

输出结果如下:

当前时间为:Tue Oct 17 10:44:41 CST 2023

执行结果截图如下:

在这里插入图片描述

如何设置日期?

  我们可以使用set()方法设置一个Calendar对象的日期或时间。

示例如下:

    //设置日期
    public static void setDate(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 2023);
        calendar.set(Calendar.MONTH, 10);
        calendar.set(Calendar.DATE, 17);
        System.out.println(calendar.getTime());
    }

输出结果如下:

Fri Nov 17 10:55:57 CST 2023

执行结果截图如下:

在这里插入图片描述

如何进行日期计算?

我们可以使用add()方法对日期进行加减计算。

示例如下:

    //日期计算
    public static void CalculateDate() {
        Calendar calendar = Calendar.getInstance();
        System.out.println("当前时间为:" + calendar.getTime());

        calendar.add(Calendar.DATE, 10);
        System.out.println("加上10天后的时间为:" + calendar.getTime());

        calendar.add(Calendar.MONTH, -2);
        System.out.println("减去2个月后的时间为:" + calendar.getTime());

        calendar.add(Calendar.YEAR, 3);
        System.out.println("加上3年后的时间为:" + calendar.getTime());
    }

输出结果如下:

当前时间为:Tue Oct 17 10:56:43 CST 2023
加上10天后的时间为:Fri Oct 27 10:56:43 CST 2023
减去2个月后的时间为:Sun Aug 27 10:56:43 CST 2023
加上3年后的时间为:Thu Aug 27 10:56:43 CST 2026

执行结果截图如下:

在这里插入图片描述

测试用例

  下面通过一个完整的测试用例来验证上述方法的正确性,请同学们参考

代码如下:

测试代码

package com.demo.javase.day52;

import java.util.Calendar;

/**
 * @author bug菌
 * @date 2023/10/17 10:44
 */
package com.demo.javase.day52;

import java.util.Calendar;

/**
 * @author bug菌
 * @date 2023/10/17 10:44
 */
public class CalendarDemo {

    public static void main(String[] args) {
        Calendar now = Calendar.getInstance();
        System.out.println("当前时间为:" + now.getTime());

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 2023);
        calendar.set(Calendar.MONTH, 10);
        calendar.set(Calendar.DATE, 17);
        System.out.println("设置时间为:" + calendar.getTime());

        calendar.add(Calendar.DATE, 10);
        System.out.println("加上10天后的时间为:" + calendar.getTime());

        calendar.add(Calendar.MONTH, -2);
        System.out.println("减去2个月后的时间为:" + calendar.getTime());

        calendar.add(Calendar.YEAR, 3);
        System.out.println("加上3年后的时间为:" + calendar.getTime());

        System.out.println("年份为:" + calendar.get(Calendar.YEAR));
        System.out.println("月份为:" + calendar.get(Calendar.MONTH));
        System.out.println("日期为:" + calendar.get(Calendar.DATE));
    }
}

测试结果

运行结果如下:

当前时间为:Tue Oct 17 11:34:59 CST 2023
设置时间为:Fri Nov 17 11:34:59 CST 2023
加上10天后的时间为:Mon Nov 27 11:34:59 CST 2023
减去2个月后的时间为:Wed Sep 27 11:34:59 CST 2023
加上3年后的时间为:Sun Sep 27 11:34:59 CST 2026
年份为:2026
月份为:8
日期为:27

执行结果截图如下:

在这里插入图片描述

测试代码解析

  如上是Java中Calendar类的使用示例。首先,通过Calendar.getInstance()方法获取当前时间,并输出当前时间;然后通过set()方法设置一个指定的时间,再通过add()方法来对时间进行加减操作。最后,通过get()方法获取对应的年、月、日等时间信息,并输出。

小结

  本文介绍了Java Calendar类的基本用法,包括如何获取当前日期、如何设置日期、如何进行日期计算以及Calendar类常用方法介绍。掌握这些技巧之后,在日常开发中进行日期计算会更加得心应手。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

  本文对Java Calendar类进行了全面的介绍,让读者能够轻松掌握日期计算技巧。希望读者能够在实际开发中加以运用,提高开发效率。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。