java Date 和 Calendar类 万字详解(通俗易懂)

简介: java API专题——常用类Date和Calender类 内容分享。
  • Date类介绍
  • Date类构造器
  • Date类使用
  • 关于SimpleDateFormat类
  • Date类对象的格式化
  • 构造Date对象的补充
  • Date类对象成员方法
  • Calendar类介绍及使用
  • 字段演示
  • 方法演示
  • LocalDateTime类介绍及使用
  • Date 和 Calendar类的局限性
  • java8新特性
  • LocalDateTime,LocalDate,LocalTime的使用
  • DateTimeFormatter类的引入和使用
  • LocalDateTime类的成员方法
  • 时间戳Instant

一、前言

本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类, 内容包括但不限于 Date类简介 Date类使用 Calendar类的简介和使用 LocalDate、LocalTime、LocalDateTime类的介绍和演示 。本节内容没什么难度,主要是介绍一些类的使用,大家可以放心食用。 注意 : 代码中的注释也很重要; 不要眼高手低,自己敲一遍才能知道怎么用。 点击侧边栏目录或者文章开头的目录可以跳转。良工不示人以朴,所有文章都会适时改进。大家如果有什么问题,都可以在评论区一块儿交流,或者私信up。 感谢阅读!

二、Date类简介

Date类,见名知意,日期类。用于操作日期相关信息

Date类属于java.base 模块,java.util包下(使用时需要导包),如下图所示:

image.png

注意,除了util包下,sql包下也有一个Date类。二者有很大差别,sql包下的Date类与数据库相关。大家在导包时要看清楚,不要导错包。如下 :

image.png

我们再看查看一下Date类的类图,如下 : 都是老面孔了,这里不再赘述)



三、Date类的构造器

1.Date() :

构造一个日期对象,直接输出Date类对象默认打印当前系统时间。

2.Date(long date) :

构造一个日期对象,时间为自"1970-1-1-00:00:00GMT"起,至指定参数的毫秒数所代表的日期。

Δ演示 :

up以Date_类为例,代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.util.Date;  //别忘了导包.publicclassDate_ {
publicstaticvoidmain(String[] args) {
//演示 : Date类构造器//1.Date()Datedate_0=newDate();
System.out.println(date_0);
System.out.println("-------------------------");
//2.Date(long date)Datedate_1=newDate(666666666);
System.out.println(date_1);
    }
}

运行结果 :

image.png


四、Date类的使用(重要)

1.SimpleDateFormat类的引入 :  

在Date类构造器的演示中可以看到,输出Date类对象默认打印当前系统时间,而且它的格式是固定的。这时,如果想改变日期默认的格式,就需要引入SimpleDateFormat类,见名知意,这个类可以对日期进行格式化。

SimpleDateFormat类属于java.base 模块, java.text包下。如下图所示 :

image.png

2.Date类对象的格式化 :

那有了SimpleDateFormat类以后,到底怎么对日期进行格式化呢?

首先我们需要用到SimpleDateFormat类的一个构造器,如下 :

SimpleDateFormat(String pattern)——

该构造器可以构造一个SimpleDateFormat对象,传入的字符串表示你将来想要的日期的格式。

其次,我们还需要通过刚刚创建的SimpleDateFormat类对象来调用SimpleDateFormat类的format方法,该方法需要传入一个Date类对象,并以字符串形式作接收。:

Δ演示 :

up以SimpleDateFormat_类为例,代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassSimpleDateFormat_ {
publicstaticvoidmain(String[] args) {
//第一步,利用带参构造创建SimpleDateFormat类对象SimpleDateFormatsdf=newSimpleDateFormat("yyyy年 MM月dd日 HH:mm:ss E");
//第二步,通过创建好的对象来调用format方法(注意形参和返回值类型)Stringformat=sdf.format(newDate());
//第三步,打印字符串形式的日期System.out.println(format);
    }
}

运行结果 :

网络异常,图片无法展示
|

这时候可能就有p小将(Personable小将,指风度翩翩的人)要出来挑刺儿说了:噢,你是演示了,我也看到了。但你那SimpleDateFormat构造器里传入的那一堆是啥玩意儿?什么yy呀,MM的,你搁这儿yy呢?

不愧是p小将,6。没错,创建SimpleDateFormat对象时传入的那一大堆雀氏是我自己杜撰的,但是,我也仅仅是杜撰了格式,那里面的一些字母,什么yy呀MM的,这可由不得我。这是SimpleDateFormat类的API文档中规定的用法如下图所示

image.png

up特意将刚刚我们用到的一些符号给标注了出来。虽然纯英文给部分读者看起来觉得很艹😂,但是其实你细看就会发现——不难。我这里只想强调一个点,就是表格下面那句话"字符往往是可以重复的,字符的个数决定了对应数据的精度。"

什么意思呢?比方说,在SimpleDateFormat构造器传入的字符串中,如果我传入了"yyyy"四个y,就可以打印出"2023";但我如果只传入了"yy"两个y,就只能打印出"23"出来,即最后的效果从"2023年"变成了"23"年。其他也同理。大家感兴趣可以自己挨个儿试试,我们这里就不做过多演示了。

3.对构造Date类对象的补充 :

除了上文中演示的Date类对象的两个构造器外,我们还可以通过方法来创建Date类对象——即通过SimpleDateFormat类的parse方法。使用该方法需要先利用带参构造创建一个SimpleDateFormat类对象,然后通过创建好的对象调用parse方法;传入一个字符串,该字符串中包含了你想保存的日期信息,eg : "2023.3.11 星期日",注意:传入的字符串的格式,必须与你创建SimpleDateFormat对象时传入的字符串格式一致;然后使用Date对象来作接收,eg : Date date = sdf.parse(str_0);。注意,使用该方法,IDEA会报编译器异常ParseException,使用throws关键字抛出即可。

Δ演示 :

up仍以Date_类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;  //别忘了导包.publicclassDate_ {
publicstaticvoidmain(String[] args) throwsParseException {
//演示 : Date类创建对象的内容补充SimpleDateFormatsdf=newSimpleDateFormat("yyyy年 M月dd日 HH:mm, E");
Stringstr_0="2023年 3月11日 10:19, 星期六";
Datedate=sdf.parse(str_0);
System.out.println(date);
    }
}

运行结果 :

image.png

可以看到,根据parse方法获取的Date对象仍然是默认格式。这时,你也可以再次结合刚才我们讲过的format方法来打印出日期的自定义格式。如下图所示  :

image.png

运行结果 :

image.png

4.Date类成员方法 :

Date类成员方法很多都已经过时,用的也不多。因此这里我们只说一个方法——

long getTime() :

该方法可以将日期对象转换成对应时间的毫秒值。

Δ演示 :

仍以Date_类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.util.Date;  //别忘了导包.publicclassDate_ {
publicstaticvoidmain(String[] args) throwsParseException {
//演示 : Date类成员方法Datedate=newDate();
longmm=date.getTime();
System.out.println(mm);
    }
}

运行结果 :

image.png


五、Calendar类

1.简介

Calendar类可以看作是对Date类的一个升级,用于操作日历相关字段。同Date类不同的是,Calendar类属于抽象类,不可被实例化。因此,获取Calendar类的对象我们一般使用Calendar类的静态方法getInstance(后面会演示到)。

Calendar类属于java.base模块,java.util包下,如下图所示 :

image.png

我们再来查看一下Calendar类的类图 :

image.png

2.Calendar类字段演示 :

Calendar类中有许多的字段,比如说当前系统的年、月、日等等。如下GIF图所示 :

image.png

获取这些字段需要调用Calendar类的get方法,返回给定日历字段的值。up以Calendar_类为演示类, 代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.util.Calendar;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassCalendar_ {
publicstaticvoidmain(String[] args) {
//演示 : 获取Calender类的字段//1.获取Calendar类实例Calendarcalendar=Calendar.getInstance();
//2.调用get方法System.out.println("year = "+calendar.get(Calendar.YEAR));
System.out.println("month = "+ (calendar.get(Calendar.MONDAY) +1));
System.out.println("day = "+calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("hour = "+calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("minute = "+calendar.get(Calendar.MINUTE));
System.out.println("second = "+calendar.get(Calendar.SECOND));
System.out.println("-------------------------------");
//3.自由组合System.out.print("Calendar = ");
System.out.println(calendar.get(Calendar.YEAR) +"年"+                (calendar.get(Calendar.MONDAY) +1) +"月"+calendar.get(Calendar.DAY_OF_MONTH) +"日"+calendar.get(Calendar.HOUR_OF_DAY) +":"+calendar.get(Calendar.MINUTE) +":"+calendar.get(Calendar.SECOND));
    }
}

运行结果 :

image.png

关于以上代码强调两点 :

月份1-12月由0-11表示,因此,若想输出真实月份,需要在get(Calendar.MONTH)基础上再加一。

Calendar类没有提供格式化日历的方法,因此我们可以自由随意组合,来调用输出。

3.Calendar类方法演示 :

Calendar类其实一共就3个方法要演示——

①static Calendar getInstance() :

该方法可以根据当前系统时区和语言环境获取日历对象。即可获得Calendar类的实例,进而调用起成员方法。

②int get(int field) :

该方法可以返回给定日历相应字段的值。

③void set(int field, int value) :

该方法可以将给定的日历字段设置为指定的值。(有重载)

不过,前两个方法我们前面都已经演示过了,这里就单演示一下第三个方法。仍以Calendar_类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar;
importjava.util.Calendar;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassCalendar_ {
publicstaticvoidmain(String[] args) {
//演示 : 获取Calender类的set方法//1.获取Calendar类实例Calendarcalendar=Calendar.getInstance();
//2.调用set方法calendar.set(Calendar.YEAR, 2002);
calendar.set(Calendar.MONDAY, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("year = "+calendar.get(Calendar.YEAR));
System.out.println("month = "+ (calendar.get(Calendar.MONDAY) +1));
System.out.println("day = "+calendar.get(Calendar.DAY_OF_MONTH));
    }
}

运行结果 :

image.png


六、关于LocalDate, LocalTime, LocalDateTime类

1.Date 和 Calendar类的一些局限性 :

Date 和 Calendar类都是在jdk版本很低的时候就存在的。在使用时它们都或多或少存在一些问题:①可变性:日期和时间这样的类是不应该被随意修改的;②偏移性:Date中的年份是从1900开始的,而Date中的月份都从0开始,不利于表示;③格式化 : Calendar类没有提供格式化日历的方法;④线程安全性 : Date和Calendar类都不是线程安全的,也不能处理闰秒等。

2.java8新特性 :

为了试图解决Date和 Calendar类的局限性,java8引入了LocalDate,LocalTime,以及LocalDateTime这三个类。分别用于表示日期(年月日),时间(时分秒),以及日期 + 时间(年月日时分秒)

先来看看LocalDateTime类的类图 :

image.png

可以看到,与前面两个类对比明显,复杂了不止一倍😂

3.LocalDateTime, LocalDate, LocalTime的使用 :

up以Local_类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar.java8;
importjava.time.LocalDate;
importjava.time.LocalDateTime;
importjava.time.LocalTime;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassLocal_ {
publicstaticvoidmain(String[] args) {
//演示 : java8新增的三个操作时间和日期的类。//1.通过LocalDateTime类的now方法,可以获取LocalDateTime类的实例LocalDateTimelocalDateTime=LocalDateTime.now();
System.out.println("当前时期 = "+localDateTime);
System.out.println("-------------------------");
System.out.println("The year = "+localDateTime.getYear());
System.out.println("The month = "+localDateTime.getMonth());
System.out.println("The day = "+localDateTime.getDayOfMonth());
System.out.println("The hour = "+localDateTime.getHour());    //24h制System.out.println("The minute = "+localDateTime.getMinute());
System.out.println("The second = "+localDateTime.getSecond());
System.out.println("-------------------------");
//2.若只考虑获取年月日(日期),可以通过now方法来获取LocalDate对象LocalDatelocalDate=LocalDate.now();
System.out.println("当前年月日 = "+localDate);
//3.若只考虑获取时分秒(时间)可以通过now方法来获取LocalTime对象LocalTimelocalTime=LocalTime.now();
System.out.println("当前时分秒 = "+localTime);
    }
}

运行结果 :

image.png

4.LocalDateTime的格式化 :

通过上面的演示我们可以看到,直接打印LocalDateTime对象,输出结果也是默认值。如果我们想格式化它的输出内容,就需要用到DateTimeFormatter类,DateTimeFormatter类与之前讲到的SimpleDateFormat类类似,在使用上也大同小异,不同的地方在于,DateTimeFormatter类对象不能直接new出来(因为该类构造器为私有),而是要通过DateTimeFormatter类的ofPattern方法来获取实例。

up以Local_2类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar.java8;
importjava.time.LocalDateTime;
importjava.time.format.DateTimeFormatter;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassLocal_2 {
publicstaticvoidmain(String[] args) {
//演示 :  LocalDateTime类对象的格式化//1.通过ofPattern方法来获取DateTimeFormatter类实例DateTimeFormatterdtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss E");
//2.通过now方法来获取LocalDateTime实例LocalDateTimelocalDateTime=LocalDateTime.now();
//3.调用format方法来格式化LocalDateTime类对象,以String类型作接收。Stringformat=dtf.format(localDateTime);
//4.打印格式化后的字符串System.out.println(format);
    }
}

运行结果 :

image.png

5.LocalDateTime类成员方法

首先,我必须陈述两个事实 : LocalDateTime类的方法非常多,如下GIF图所示 :

image.png

我们已经介绍了API文档,以后大家遇到什么没见过或者不理解的方法,都可以去API文档中进行查看。

因此,up决定只给大家演示一下比较牛逼,看着特别直观的两个方法,那就是plusDays(long daysToSubtract) 和 minusDays(long daysToSubtract)。up以Local_Methods类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar.java8;
importjava.time.LocalDateTime;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassLocal_Methods {
publicstaticvoidmain(String[] args) {
//演示 : LocalDateTime类的两个成员方法LocalDateTimel1=LocalDateTime.now();
System.out.println("当前时间 = "+l1);
LocalDateTimel2=l1.plusDays(620);
System.out.println("620天后是什么日子:"+l2);
LocalDateTimel3=l1.minusDays(330);
System.out.println("330天前是什么日子:"+l3);
    }
}

运行结果 :

image.png

七、关于时间戳Instant :

1.介绍

java提供了Instant类来表示时间戳,见名知意,Instant就是指瞬时时间,时间戳就是某一瞬时时间的特定值。Instant类可以与Date类相互转化。但是要获取Instant对象,需要用到Instant类的静态方法——now方法。

2.Δ演示 :

up以Instant_类为演示类,代码如下 :

packagecsdn.knowledge.api.date_calendar.java8;
importjava.time.Instant;
importjava.util.Date;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassInstant_ {
publicstaticvoidmain(String[] args) {
//演示 : 时间戳Instant//1.通过静态方法now来获取Instant类的实例Instantinstant=Instant.now();
System.out.println(instant);
System.out.println("--------------------");
//2.Date类静态方法——from方法可以实现Instant ——> DateDatedate=Date.from(instant);
System.out.println(date);
System.out.println("--------------------");
//3.通过Date类对象调用toInstant方法,可以实现Date ——> InstantInstantinstant1=date.toInstant();
System.out.println(instant1);
    }
}

运行结果 :

image.png


八、总结 :

🆗 ,以上就是我们Date, Calendar类的全部内容了。重点在于这些类的使用,因为本身并没有什么难度,没有那些抽象的难理解的东西,就是单纯的工具类,会用就行。对于这些类的方法,up没有一一演示出来,大家也不用担心,我们既已学会如何使用API 文档,有遇到什么方法直接去API 文档查看就彳亍。 下一小节就是我们API-常用类的最后一小节——包装类了,大家不见不散! 感谢阅读!

System.out.println("END---------------------------------------------------------");

目录
相关文章
|
26天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
36 6
|
14天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
37 17
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
11天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
15天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
19天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
19天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
19天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
22 3
|
22天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
21 5