Java 中Calendar日历类的基本使用

简介: Java 中Calendar日历类的基本使用

Calendar介绍:

Calendar类为某一时刻和一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法。

Calendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化。

下面代码中给出Calendar类常用的方法,详细注释已经在代码中给出:

代码一:

public class CalendarDemo {
    public static void main(String[] args) {
        //获取Calendar对象
        Calendar calendar = Calendar.getInstance(); //多态的形式得到的对象
//        System.out.println(calendar);
        //public int get(int field)  返回给定日历字段的值
//        int year = calendar.get(Calendar.YEAR);
//        int month = calendar.get(Calendar.MONTH) + 1; //月份是从零开始的
//        int date = calendar.get(Calendar.DATE);
//        System.out.println(year + "年 " + month + "月 " + date + "日"); //2021年 11月 30日
        //需求1  3年前的今天
        //根据日历的规则,将指定的时间量添加或减去给定的日历字段
//        calendar.add(Calendar.YEAR,-3);
//        int year = calendar.get(Calendar.YEAR);
//        int month = calendar.get(Calendar.MONTH) + 1; //月份是从零开始的
//        int date = calendar.get(Calendar.DATE);
//        System.out.println(year + "年 " + month + "月 " + date + "日");//2018年 11月 30日
        //需求2  10年后的5天前
//        calendar.add(Calendar.YEAR, 10);
//        calendar.add(Calendar.DATE, -5);
//
//        int year = calendar.get(Calendar.YEAR);
//        int month = calendar.get(Calendar.MONTH) + 1; //月份是从零开始的
//        int date = calendar.get(Calendar.DATE);
//        System.out.println(year + "年 " + month + "月 " + date + "日");  //2031年 11月 25日
        //设置当前日历的年月日
        calendar.set(2025,11,30);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; //月份是从零开始的
        int date = calendar.get(Calendar.DATE);
        System.out.println(year + "年 " + month + "月 " + date + "日");  //2025年 12月 30日
    }
}

代码二:

public class Calendar_ {
    public static void main(String[] args) {
        //1.Calendar是一个抽象类,并且构造器是private
        //2.可以通过getInstance()来获取实例
        //3.提供大量的方法和字段给程序员
        //4.Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)
        //5.如果我们需要按照24小时进制来获取时间,Calendar.HOUR--->Calendar.HOUR_OF_DAY
        Calendar calendar = Calendar.getInstance();//创建日历类对象
        System.out.println("calendar=" + calendar);
        //2.获取日历类对象的某个日历字段
        System.out.println("年:" + calendar.get(Calendar.YEAR));
        System.out.println("月:" + (calendar.get(Calendar.MONTH) + 1));
        System.out.println("日:" + calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println("小时:" + calendar.get(Calendar.HOUR));
        System.out.println("分钟:" + calendar.get(Calendar.MINUTE));
        System.out.println("秒:" + calendar.get(Calendar.SECOND));
        System.out.println(calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH)
                + " " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND)
        );
    }
}

输出结果如下:

calendar=java.util.GregorianCalendar[time=1647662681898,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=3,DAY_OF_MONTH=19,DAY_OF_YEAR=78,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=4,SECOND=41,MILLISECOND=898,ZONE_OFFSET=28800000,DST_OFFSET=0]
年:2022
月:3
日:19
小时:0
分钟:4
秒:41
2022-3-19 0:4:41

练习,获取任意年份2月份有多少天?

public class CalendarTest {
    public static void main(String[] args) {
        //键盘输入任意的年份
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份:");
        int year = sc.nextInt();
        Calendar calendar = Calendar.getInstance();
        //设置日历对象的年,月,日
        calendar.set(year, 2, 1);
        //3月1日往前推一天,就是2月的最后一天
        calendar.add(Calendar.DATE, -1);
        //获取这一天输出即可
        int day = calendar.get(Calendar.DATE);
        System.out.println(year + "年的2月份有" + day + "天");
    }
}

输出结果:


目录
相关文章
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
151 57
|
5天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
54 8
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
78 2
|
1月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
29 0
|
3天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
5天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
5天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。