Java常用日期类(包含三代)_Date类及Calendar类等

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 从JDK 1.0出现。表示一个日期和时间,精确到毫秒,内部getTime()从1970年1月1号开始算。

一.java.util.Date类概述


从JDK 1.0出现。

表示一个日期和时间,精确到毫秒,内部getTime()从1970年1月1号开始算。

ff2dc31a686ab40b18dbf5b4380ae7d9.png



1. java.util.Date类构造


部份构造已经过时,重点看以下两个构造


public Date()


从运行程序的此时此刻到时间原点经历的毫秒值,转化成Date类对象,分配Date类对象并初始化此对象,以表示分配它的时间(精确到毫秒)。


public Date(long date)


将指定参数的毫秒值date,转化成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为历元epoch),即1970年1月1号0点以来指定的毫秒数。


不过具体来说应该是8点,因为中国处于东八区(GMT+08:00)是比世界协调时间/格林尼治时间(GMT)快8个小时的时区,所以当格林尼治标准时间为0:00,东八区标准时间是8:00。


两个构造的使用场景选择


无参构造


可以自动设置当前系统时间的毫秒时刻


long类型的有参构造


可以自定义毫秒时刻。


1s=1000ms。

111111.png



2.创建一个当前时间的Date对象

public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date);//Sat Nov 06 14:11:12 CST 2022
}


打印的时候会自动调用toString方法,Date类进行了重写。

但是打印的格式怎么是外国的这种呢?

应该怎么转换成我们经常看的年月日形式呢?



3. Date类中常用的方法

System.out.println(date.getTime());//1636196765779


获取当前日期对象距离标准基准时间的毫秒值。

这串数字是从1970年1月1号开始算到至今的毫秒值。

有什么用呢?

public void setTime(long time)


设置当前日期对象距离标准基准时间的毫秒值,意味着改变了当前日期对象。

public Boolean after(Date when)


此日期是否在指定日期之后。

public Boolean before(Date when)


此日期是否在指定日期之前。


示例代码:

public static void main(String[] args) {
    //打印当前日期
    Date date1 = new Date();
    System.out.println(date1);//Sat Nov 06 14:11:12 CST 2022
    //创建以标准基准时间为基准,指定往后偏移1000ms
    Date date2 = new Date(1000);
    System.out.println(date2);//Thu Jan 01 08:00:01 CST 1970
    //获取当前日期对象距离标准基准时间的毫秒值
    System.out.println(date1.getTime());//1636196765779
    System.out.println(date1.getTime());//1000
    //修改date1距离标准基准时间的毫秒值为2000
    date1.setTime(2000);
    System.out.println(date1);//Thu Jan 01 08:00:02 CST 1970
    date2.setTime(2000);
    System.out.println(date2);//Thu Jan 01 08:00:02 CST 1970
    //创建当前时间的对象
    Date date3 = new Date();
    System.out.println("date3的日期是否在date1之前"+date3.before(date1));//false
    System.out.println("date3的日期是否在date1之后"+date3.after(date1));//true


二. DateFormat类概述


DateFormat是日期/时间格式化子类的’抽象类’

作用:

1.格式化:(日期——>文本)Date—>String

2.解析:(文本——>日期)String—>Date

由于DateFormat是一个抽象类,无法创建对象使用,可以使用其子类SimpleDateFormat。这个类需要一个格式(模式)来指定格式化或者解析的标准。

构造方法:


SimpleDateFormat(String pattern):使用给定模式并使用默认语言环境的日期格式符号的构造方法。


参数:

String pattern:代表日期时间的自定义格式。

模式:

字母不能更改,连接符号可以改变。

区分大小写 “yyyy-MM-dd”年月日

                “HH:mm:ss” //时分秒


y
M
d
H
m

s

(区分大小写)


1. DateFormat类常用的方法


public String format(Date date):将Date对象格式化为字符串。

public Date parse(String source):将字符串解析为Date对象。


public static void main(String[] args) {
    Date date = new Date();
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年mm月dd日 HH时mm分ss秒")
    //格式化format() String
    String s=sdf.format(date);
    System.out.println(s); 2022年04月22日 14时45分49秒
    ---------------------------------
    //解析
    String str="2022-04-22 17:09:22"
    String str1="2022年04月22日 17时09分22秒"
    //报错,因为sdf格式模板和str格式不一样,无法解析
    Date date=sdf.parse(str);
    //正常,格式对上了
    Date date1=sdf.parse(str1);
    System.out.println(date); 
    System.out.println(date1); 
}


三.java.util.Calendar类

从JDK1.1出现Calendar类后,Date类大部分方法都被弃用了。

Calendar类的功能要比Date类强大,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。且在实现方式上也比Date类要复杂一些。

由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类构造来创建对象,API提供了getInstance方法用来创建对象。


1.创建一个当前日期的Calendar对象

Calendar calendar = Calendar.getInstance();//默认是当前日期


2.创建一个指定日期的Calendar对象

    Calendar calendar = Calendar.getInstance();
    calendar.set(2021, 5, 9);
    System.out.println(calendar.getTime());//Wed Jun 09 18:36:09 CST 2021


3.利用set方法设置日期

69edebd181bb15d5ffdb382629a962fc.png

a10059f697abace500c902025ae345db.png

1.png

1e6085decb7f19fe478ef08688d48f77.png

2.png


4.利用字段类型设置

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR,2022);
    calendar.set(Calendar.MONTH,11);
    calendar.set(Calendar.DAY_OF_MONTH,1);
    System.out.println(calendar.getTime());//Mon Dec 01 18:39:22 CST 2022
}


Calendar类中用一下这些常量表示不同意义

Calendar.YEAR——年

Calendar.MONTH——月

Calendar.DATE——日

Calendar.DAY_OF_MONTH——日期,和上面的字段意义一样

Calendar.HOUR——12小时制小时

Calendar.HOUR_OF_DAY——24小时制小时

Calendar.MINUTE——分

Calendar.SECOND——秒

Calendar.DAY_OF_WEEK——周几


5.利用add方法设置日期


官方解释:

* Adds or subtracts the specified amount of time to the given calendar field,

* based on the calendar's rules. For example, to subtract 5 days from

* the current time of the calendar, you can achieve it by calling:

* <p><code>add(Calendar.DAY_OF_MONTH, -5)</code>.

博主解释:

在原本的日期上继续加日期。

47f29c8ffaee27d9492a09a60a2bae7a.png


public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR,2022);//2022年
    calendar.set(Calendar.MONTH,11);//11月
    calendar.set(Calendar.DAY_OF_MONTH,6);//6号
    calendar.add(Calendar.DAY_OF_MONTH,1);//往后加了一天,变成7号
    System.out.println(calendar.getTime());//Wed Dec 07 18:42:25 CST 2022
}


6.利用get方法获取日期


博主解释:

获取Calendar对象的年月日等日期参数。

045a3b7542a06541c81ec5113d03295c.png


public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR,2022);
    calendar.set(Calendar.MONTH,7);
    calendar.set(Calendar.DAY_OF_MONTH,1);
    calendar.add(Calendar.DAY_OF_MONTH,2);
    System.out.println(calendar.get(Calendar.YEAR));//2022
    System.out.println(calendar.get(Calendar.MONTH));//7
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//3
}

四.类型转化


1、Date与long

 public static void main(String[] args) {
    Date date = new Date();
    long time = date.getTime();
}


2、Calendar与long

 public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR,2021);
    calendar.set(Calendar.MONTH,11);
    calendar.set(Calendar.DAY_OF_MONTH,6);
    calendar.add(Calendar.DAY_OF_MONTH,2);
    long timeInMillis = calendar.getTimeInMillis();
}


3、Date与Calendar互转


(1)Date转Calendar

 public static void main(String[] args) {
    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
}


(2)Calendar转Date

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR,2021);
    calendar.set(Calendar.MONTH,11);
    calendar.set(Calendar.DAY_OF_MONTH,6);
    calendar.add(Calendar.DAY_OF_MONTH,2);
    Date time = calendar.getTime();
}


4、String与Date互转


第二点有讲


5、String与Calendar互转


(1)Calendar 转化 String

 public static void main(String[] args) throws ParseException {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String str = sdf.format(calendar.getTime());
}


(2)String 转化Calendar

public static void main(String[] args) throws ParseException {
    String str="2021-11-6";
    SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
    Date date =sdf.parse(str);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    System.out.println(calendar.getTime());//Sat Nov 06 00:00:00 CST 2021
}


本文一部份借鉴了哪吒博主:

原文链接:https://blog.csdn.net/guorui_java/article/details/121183146

目录
相关文章
|
12天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
36 17
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
9天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
20 2
|
13天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
15天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
15 9
|
5天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
2天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin