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

news2024/12/23 7:07:02
  • Date类介绍及使用

  • 关于SimpleDateFormat类

  • Calendar类介绍及使用

  • LocalDateTime类介绍及使用

  • 关于DateTimeFormatter类


一、前言

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

二、Date类简介

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

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

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

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


三、Date类的构造器

1.Date() :

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

2.Date(long date) :

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

Δ演示 :

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

package csdn.knowledge.api.date_calendar;

import java.util.Date;  //别忘了导包.

public class Date_ {
    public static void main(String[] args) {
    //演示 : Date类构造器
        //1.Date()
        Date date_0 = new Date();
        System.out.println(date_0);
        System.out.println("-------------------------");

        //2.Date(long date)
        Date date_1 = new Date(666666666);
        System.out.println(date_1);
    }
}

运行结果 :


四、Date类的使用(重要)

1.SimpleDateFormat类的引入 :

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

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

2.Date类对象的格式化 :

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

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

SimpleDateFormat(String pattern)——

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

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

Δ演示 :

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

package csdn.knowledge.api.date_calendar;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormat_ {
    public static void main(String[] args) {
        //第一步,利用带参构造创建SimpleDateFormat类对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年 MM月dd日 HH:mm:ss E");

        //第二步,通过创建好的对象来调用format方法(注意形参和返回值类型)
        String format = sdf.format(new Date());

        //第三步,打印字符串形式的日期
        System.out.println(format);
    }
}

运行结果 :

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

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

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_类为演示类,代码如下 :

package csdn.knowledge.api.date_calendar;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;  //别忘了导包.

public class Date_ {
    public static void main(String[] args) throws ParseException {
    //演示 : Date类创建对象的内容补充
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年 M月dd日 HH:mm, E");
        String str_0 = "2023年 3月11日 10:19, 星期六";
        Date date = sdf.parse(str_0);
        System.out.println(date);
    }
}

运行结果 :

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

运行结果 :

4.Date类成员方法 :

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

long getTime() :

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

Δ演示 :

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

package csdn.knowledge.api.date_calendar;

import java.util.Date;  //别忘了导包.

public class Date_ {
    public static void main(String[] args) throws ParseException {
    //演示 : Date类成员方法
        Date date = new Date();
        long mm = date.getTime();
        System.out.println(mm);
    }
}

运行结果 :


五、Calendar类

1.简介

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

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

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

2.Calendar类字段演示 :

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

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

package csdn.knowledge.api.date_calendar;

import java.util.Calendar;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Calendar_ {
    public static void main(String[] args) {
    //演示 : 获取Calender类的字段
        //1.获取Calendar类实例
        Calendar calendar = 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));
    }
}

运行结果 :

关于以上代码强调两点 :

月份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_类为演示类,代码如下 :

package csdn.knowledge.api.date_calendar;

import java.util.Calendar;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Calendar_ {
    public static void main(String[] args) {
    //演示 : 获取Calender类的set方法
        //1.获取Calendar类实例
        Calendar calendar = 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));
    }
}

运行结果 :


六、关于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类的类图 :

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

3.LocalDateTime, LocalDate, LocalTime的使用 :

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

package csdn.knowledge.api.date_calendar.java8;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Local_ {
    public static void main(String[] args) {
    //演示 : java8新增的三个操作时间和日期的类。
        //1.通过LocalDateTime类的now方法,可以获取LocalDateTime类的实例
        LocalDateTime localDateTime = 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对象
        LocalDate localDate = LocalDate.now();
        System.out.println("当前年月日 = " + localDate);

        //3.若只考虑获取时分秒(时间)可以通过now方法来获取LocalTime对象
        LocalTime localTime = LocalTime.now();
        System.out.println("当前时分秒 = " + localTime);
    }
}

运行结果 :

4.LocalDateTime的格式化 :

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

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

package csdn.knowledge.api.date_calendar.java8;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

运行结果 :

5.LocalDateTime类成员方法

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

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

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

package csdn.knowledge.api.date_calendar.java8;

import java.time.LocalDateTime;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Local_Methods {
    public static void main(String[] args) {
    //演示 : LocalDateTime类的两个成员方法
        LocalDateTime l1 = LocalDateTime.now();
        System.out.println("当前时间 = " + l1);

        LocalDateTime l2 = l1.plusDays(620);
        System.out.println("620天后是什么日子:" + l2);

        LocalDateTime l3 = l1.minusDays(330);
        System.out.println("330天前是什么日子:" + l3);
    }
}

运行结果 :

6.关于时间戳 :

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

Δ演示 :

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

package csdn.knowledge.api.date_calendar.java8;

import java.time.Instant;
import java.util.Date;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Instant_ {
    public static void main(String[] args) {
    //演示 : 时间戳Instant
        //1.通过静态方法now来获取Instant类的实例
        Instant instant = Instant.now();
        System.out.println(instant);
        System.out.println("--------------------");

        //2.Date类静态方法——from方法可以实现Instant ——> Date
        Date date = Date.from(instant);
        System.out.println(date);
        System.out.println("--------------------");

        //3.通过Date类对象调用toInstant方法,可以实现Date ——> Instant
        Instant instant1 = date.toInstant();
        System.out.println(instant1);
    }
}

运行结果 :


七、总结 :

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序】-- 自定义组件 - 数据监听器 (三十四)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆,上次有报道发布站一年盈利几个亿,还是有很大的机会,很多玩家因为GM开服关服给折腾,刚充的钱服务器就关了,很是恼火,于是都想自己整个服开开,但又不知道从何下手&…

三菱FX5U之数据处理类指令的使用

本课程使用三菱PLC works3编程软件进行教学,并使用works3的仿真功能进行PLC仿真,学习的时候不需要有实物PLC。 补充说明:三菱 FX 5U系列PLC使用的是GX works3编程软件,FX 3U、Q系列PLC使用的是GX works3编程软件。 第一章 八个案…

YUV实践记录

文章目录YUV基础介绍:不同采样YUV格式的区别为什么要使用YUV格式呢?YUV的存储方式Android中的YUV_420_888附录:YUV基础介绍: YUV在做手机图像或者视频处理的时候会经常用到的一个格式,用此文来记录YUV相关介绍&#xf…

hibernate学习(五)

hibernate学习(五) hibernate的一对多关联映射: 一、数据库表与表之间关系 一对多建表原则: 多对多的建表原则: 一对一建表原则: (1)唯一外键对应: (…

时间复杂度和空间复杂度的计算

目录 算法的复杂度 时间复杂的的概念 时间复杂度计算方法 大O的渐进表示法 空间复杂的概念 空间复杂的的计算方法 时间和空间复杂度的应用 消失的数字 轮转数组 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存&…

modbus转profinet网关连接5台台达ME300变频器案例

通过兴达易控Modbus转Profinet(XD-MDPN100)网关改善网络场景,变频器有掉线或数据丢失报警,影响系统的正常运行,将5台 ME300变频器modbus转Profinet到1200PLC,通过网关还可以实现Profinet转modbus RTU协议转…

LabVIEW中以编程方式获取VI克隆名称

LabVIEW中以编程方式获取VI克隆名称演示如何以编程方式获取VI的名称或克隆名称。如果VI作为顶级VI运行,则将显示VI的名称。如果VI在主VI中用作子VI,它将返回克隆的名称。在项目开发过程中,有时需要获取VI的名称。在此示例中,实现了…

【数论】试除法判断质数,分解质因数,筛质数

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 现已更新完KMP算法、排序模板,之…

代码管理--svnadmin工具介绍

1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权限上了规模后,手动管理就变的非常容易出错,本系统能够识别人员和权限…

【AWS入门】IAM基本应用-2023/3/4

目录IAM概述根用户和IAM用户参考IAM概述 IAM(Identity Access Management)是身份和访问管理服务,要访问AWS服务和资源,就要使用IAM进行身份验证和授权。当我们通过控制台,CLI,或API访问AWS服务时,都需要通…

p5.js map映射

theme: smartblue 本文正在参加「金石计划」 本文简介 带尬猴,我嗨德育处主任 p5.js 为开发者提供了很多有用的方法,这些方法实现起来可能不难,但却非常实用,能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map…

《计算机网络》期末复习笔记

文章目录一、一些英文名词的标签(方便记忆)二、OSI七层协议三、综合题3.0 知识点储备3.1 在Internet 网中,某计算机的IP 地址是11001010.01100000.00101100.01011000 ,请回答下列问题3.2 假定发送方要发送的数据为10000101。采用C…

【Spring 深入学习】AOP的前世今生之后续

AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程,一般可以帮助我们在不修改现有代码的情…

Java中字符流(FileReader(read、close)、FileWriter(write、close)、字符(输入、输出)流原理解析)

1.创建对象: 2.读取数据 3.释放资源(关流) 如何使用重载的read()方法呢? FileWriter: 在前面我们指导,字节输出流和字符输出流的本质区别是,字节输出流一次只能操作一个字节,如果让…

QEMU启动ARM32 Linux内核

目录前言前置知识ARM Versatile Express开发板简介ARM处理器家族简介安装qemu-system-arm安装交叉编译工具交叉编译ARM32 Linux内核交叉编译ARM32 Busybox使用busybox制作initramfs使用QEMU启动ARM32 Linux内核模拟vexpress-a9开发板模拟vexpress-a15开发板参考前言 本文介绍采…

【数据库】数据库基础架构

数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统,因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层,一个是Server层,另一个是存储引擎层,而我们常用的就是MyISAM、InnoDB,主要负…

16、字符串生成器

目录 (1)append()方法 (2)insert(int offset, arg)方法 (3)delete(int start , int end)方法 创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“”可以达到…

Java【二叉搜索树和哈希表】详细图解 / 模拟实现 + 【Map和Set】常用方法介绍

文章目录前言一、二叉搜索树1、什么是二叉搜索树2、模拟实现二叉搜索树2.1, 查找2.2, 插入2.3, 删除3、性能分析二、模型三、哈希表1、什么是哈希表1.1, 什么是哈希冲突1.2, 避免, 解决哈希冲突1.2.1, 避免: 调节负载因子1.2.2, 解决1: 闭散列(了解)1.2.3, 解决2: 开散列/哈希桶…

Uipath Excel 自动化系列18-RefreshPivotTable(刷新透视表)

活动描述 RefreshPivotTable(刷新透视表):如果透视表的数据源发生变化,需使用刷新透视表活动,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图: RefreshPivotTable(刷新透视表)属性 属性 作用 Display…