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

news2025/7/19 21:56:39

一.java.util.Date类概述

从JDK 1.0出现。

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


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。


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

  1. 解析:(文本——>日期)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方法设置日期

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>.

博主解释:

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

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对象的年月日等日期参数。

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


五. java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime类概述

从JDK 8后加入了第三代日期类,不在util包中了,转移到了time包中。

前面两代日期类的不足分析JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar也存在问题是:

1)可变性:像日期和时间这样的类应该是不可变的。

2)偏移性:Date中的年份是从1900开始的,而月份都从0开始。

3)格式化:格式化只对Date有用,Calendar则不行。

4)此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)。


LocalDate(日期/年月日)

LocalTime(时间/时分秒)

LocalDateTime(日期时间/年月日时分秒)

LocalDate只包含日期,可以获取日期字段

LocalTime只包含时间,可以获取时间字段

LocalDateTime包含日期+时间,可以获取日期和时间字段。


1.三个类常用方法

// 使用 now() 返回表示当前日期时间的对象
LocalDateTime ldt = LocalDateTime.now(); 
                    //LocalDate.now();
                    //LocalTime.now()
System.out.println(ldt);

使用 DateTimeFormatter 对象来进行格式化。

// 创建 DateTimeFormatter 对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dateTimeFormatter.format(ldt);
System.out.println("格式化的日期=" + format);

获取对象中的年月日时分秒。

System.out.println("年=" + ldt.getYear());
System.out.println("月=" + ldt.getMonth());
System.out.println("月=" + ldt.getMonthValue());
System.out.println("日=" + ldt.getDayOfMonth());
System.out.println("时=" + ldt.getHour());
System.out.println("分=" + ldt.getMinute());
System.out.println("秒=" + ldt.getSecond());

分别设置日期和时间

LocalDate now = LocalDate.now(); //可以获取年月日
LocalTime now2 = LocalTime.now();//可以获取时分秒

对时间进行加减

//提供 plus 和 minus 方法可以对当前时间进行加或者减
//看看 890 天后,是什么时候 把 年月日-时分秒
LocalDateTime localDateTime = ldt.plusDays(890);
System.out.println("890 天后=" + dateTimeFormatter.format(localDateTime));

//看看在 3456 分钟前是什么时候,把 年月日-时分秒输出
LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
System.out.println("3456 分钟前 日期=" + dateTimeFormatter.format(localDateTime2));

2.DateTimeFormatter 格式日期类

类似于SimpleDateFormat。

DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);
String str = dtf.format(日期对象);

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

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

相关文章

Java学习笔记 --- 正则表达式

一、体验正则表达式 package com.javase.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 体验正则表达式&#xff0c;给文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假设&#xff0c;编写了爬虫&…

【2023】助力Android金三银四面试

前言 新气象&#xff0c;新生机。在2023年的Android开发行业中&#xff0c;又有那些新的面试题出现呢&#xff1f;对于Android面试官的拷问&#xff0c;我们又如何正确去解答&#xff1f;万变不离其宗&#xff0c;其实只要Android的技术层面没变化&#xff0c;面试题也就是差不…

江苏专转本考前焦虑自救指南

考前焦虑自救指南 考试即将来临&#xff0c;面对着人生里未知的门槛&#xff0c;我们的心里总是充满着各种迟疑&#xff0c;成功的对立面永远都充斥着各种不确定性。 陷入考前焦虑&#xff0c;需要立即调整状态。 1、将你的内心恐惧用笔写下来 这样做的目的就是&#xff0c;不要…

git的使用(终端输入指令) 上

git目录前言1.创建仓库2.创建文件和修改数据状态分区![分区](https://img-blog.csdnimg.cn/d124dec6b2b14769ad20b75490f29cae.png)3 .删除、撤销重置 、和比较前言 今天带大家手把手敲一遍 git 流程&#xff1a; 安装一下git&#xff08;详细观看我之前发的git文档&#xff0…

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

【无标题】智能工业安全用电监测与智慧能源解决方案

工业互联网已成为全球制造业发展的新趋势。在新基建的推动下&#xff0c;5G、人工智能、云计算等技术与传统工业深度融合&#xff0c;为实现智能制造提供了技术支撑&#xff0c;将有力促进制造强国早日实现。 十四五规划在新基建的基础上进一步加快了制造业转型升级的步伐&…

【添砖java】谁说编程第一步是hello world

编程第一步明明是下载编译器和配置环境&#xff08;小声逼逼&#xff09;。 Windows下的java环境安装&#xff1a; java的安装包分为两类&#xff0c;一类是JRE&#xff08;Java Runtime Environmental&#xff09;&#xff0c;是一个独立的java运行环境&#xff1b;一类是JDK…

《Linux运维实战:Centos7.6基于ansible一键离线部署rabbitmq3.9.16+haproxy高可用镜像模式集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署 rabbitmqhaproxy高可用镜像模式集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c…

RT-Thread移植到STM32F407

文章目录第一步&#xff1a;获取RT-Thread源码第二步&#xff1a;项目结构介绍第三步&#xff1a;拷贝示例代码到裸机工程第四步&#xff1a;删除无用文件第五步&#xff1a;修改工程目录结构第六步&#xff1a;添加工程文件路径第七步&#xff1a;编译第八步&#xff1a;修改配…

MySQL进阶篇之视图/存储过程/触发器

今天我们主要来快速学习视图&#xff0c;存储过程&#xff0c;触发器四个方面的内容&#xff0c;一起加油学习吧&#xff0c;还有半年就有秋招了&#xff0c;要加快速度了&#xff0c;迫在眉睫&#xff0c;冲吧&#xff0c;兄弟们。 目录 1、视图 2、存储过程 3、存储函数 4、…

Linux系统Nginx下载和安装

文章目录golang学习面试网站Linux启动nginx参考Linux启动nginx版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/weixin_36755535/article/details/110…

使用GDAL进行坐标转换

1、地理坐标系与投影坐标系空间参考中主要包含大地水准面、地球椭球体、投影坐标系等几部分内容。地图投影就是把地球表面的任意点&#xff0c;利用一定数学法则&#xff0c;转换到地图平面上的理论和方法&#xff0c;一般有两种坐标系来进行表示&#xff0c;分别是地理坐标系和…

Free for photo container detection, container damage detect PaaS

集装箱箱号识别API免费&#xff0c;飞瞳引擎集装箱人工智能平台&#xff0c;可通过API二次开发或小程序拍照使用&#xff0c;可二次开发应用码头港区海关仓库口岸铁路场站船公司堆场&#xff0c;实现云端集装箱信息识别/集装箱箱况残损检测/好坏箱检验&#xff0c;高检测率/高实…

对话数字化经营新模式:第2届22客户节(22Day)年猪宴圆满结束!

2023年2月22日&#xff0c;由杭州电子商务研究院联合贰贰网络(集团)、TO B总监联盟等发起举办的“第二届客户节22Day”暨2022年度爱名奖 AM AWARDS颁奖及22年猪宴沙龙活动圆满结束。 &#xff08;主持人&#xff1a;杜灵芝&#xff09; 本次沙龙邀请到浙江工业大学管理学院程志…

windows版 redis在同意局域网下互联

项目场景&#xff1a; 同一局域网下各个主机互相连接同一个redis 问题描述 无法连接 原因分析&#xff1a; 没有放行对方的地址 解决方案&#xff1a; 修改配置文件 最重要的一步如下 然后把 redis.windows.conf的文件也照上面的修改一下保持一致 然后安装一下redis服务这…

腾讯在海外游戏和短视频广告领域的新增长机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 腾讯(00700)的收入在过去几个季度一直在下降&#xff0c;部分原因是由于新冠疫情导致的经济放缓以及中国监管机构对大型科技公司的监管收紧导致游戏行业萎缩造成的。 然而&#xff0c;猛兽财经认为&#xff0c;这些不利因素…

java 面试问题(一)

文章目录1、Iterator 怎么使用2、Iterator 和 ListIterator 有什么区别3、怎么确保一个集合不能被修改4、 队列和栈是什么5、什么是 Java 的内存模型6、Volatile 关键字的作用7、Volatile 与 Synchronized 比较8、ThreadLocal 介绍9、ThreadLocal 与 Synchronized 的区别10、哪…

十五、多路查找树

1、二叉树与B树 1.1 二叉树的问题分析 二叉树的操作效率较高&#xff0c;但是也存在问题&#xff0c;请看下面的二叉树 二叉树需要加载到内存中&#xff0c;如果二叉树的节点少&#xff0c;没有什么问题&#xff0c;但是如果二叉树的节点很多&#xff08;比如 1 亿&#xff…

使用antlr实现一个简单的表达式解析

背景 之前在做游戏的过程中&#xff0c;我们经常需要解析一些公式&#xff0c;比如(对方攻击值-对方防御值)*2这种表达式&#xff0c;我们习惯于用代码写死公式&#xff0c;但是这种方式不够灵活&#xff0c;我们想要的是一种灵活的解析方式&#xff0c; 只需要策划输入一个任…

教师管理系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;1.1 计算机管理教师的意义近年来&#xff0c;随着经济的发展&#xff0c;教育正面向着大型化、规模化的方向发展&#xff0c;教师数量急剧增加&#xff0c;有关教师的各种信息量也成倍增长。在这种情况下用计算机可使人们从繁重的劳…