Java的日期时间API

news2024/11/20 20:32:34

目录

JDK8之前的日期时间API

java.lang.System类

java.util.Date类

java.text.SimpleDateFormat类

java.util.Calendar(日历)类

java.util.GregorianCalendar类

JDK8中新日期时间API

LocalDate、LocalTime、LocalDateTime 类

Instant类

java.time.format.DateTimeFormatter类

其它API

与传统日期处理的转换


JDK8之前的日期时间API

java.lang.System类

System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。

计算世界时间的主要标准有:
        UTC(Coordinated Universal Time)
        GMT(Greenwich Mean Time)
        CST(Central Standard Time)

java.util.Date类

java.util 包提供了 Date 类来封装当前的日期和时间。表示特定的瞬间,精确到毫秒。

构造器

Date()使用无参构造器创建的对象可以获取本地当前时间
Date(long millisec)构造函数接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数

常用方法

Date 对象创建以后,可以调用下面的方法:

序号方法和描述
1boolean after(Date date)
若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
2boolean before(Date date)
若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
3Object clone( )
返回此对象的副本。
4int compareTo(Date date)
比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
5int compareTo(Object obj)
若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。
6boolean equals(Object date)
当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
7long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
8int hashCode( )
 返回此对象的哈希码值。
9void setTime(long time)
 
用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
10String toString( )
把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

日期比较

Java使用以下三种方法来比较两个日期:

1)使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。

2)使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。

3)使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

java.text.SimpleDateFormat类

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。

构造方法

SimpleDateFormat()默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern)该构造方法可以用参数pattern指定的格式创建一个对象

格式化和解析

SimpleDateFormat允许进行格式化:日期 -> 文本、解析:文本 -> 日期。

public String format(Date date)格式化时间对象date
public Date parse(String source)从给定字符串的开始解析文本,以生成一个日期

日期和时间的格式化编码

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

字母描述示例
G纪元标记AD
y四位年份2001
M月份July or 07
d一个月的日期10
h A.M./P.M. (1~12)格式小时12
H一天中的小时 (0~23)22
m分钟数30
s秒数55
S毫秒数234
E星期几Tuesday
D一年中的日子360
F一个月中第几周的周几2 (second Wed. in July)
w一年中第几周40
W一个月中第几周1
aA.M./P.M. 标记PM
k一天中的小时(1~24)24
K A.M./P.M. (0~11)格式小时10
z时区Eastern Standard Time
'文字定界符Delimiter
"单引号`

java.util.Calendar(日历)类

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。

Calendar类是一个抽象类,主用用于完成日期字段之间相互操作的功能。在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

Calendar类对象创建和设置

创建一个代表系统当前日期的Calendar对象:

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

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

使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2023年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2023, 6 - 1, 12);

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

public void set(int field,int value)

把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算:

c1.set(Calendar.DATE,10);

把c1对象代表的年份设置为2022年,其他的所有数值会被重新计算:

c1.set(Calendar.YEAR,2022);

其他字段属性set的意义以此类推。

Calendar类对象信息的获取

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

Calendar类对象字段类型

Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想。

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同
Calendar.HOUR12小时制的小时
Calendar.HOUR_OF_DAY24小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几

java.util.GregorianCalendar类

Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。

Calendar的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。

GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。

构造方法

序号构造函数和说明
1GregorianCalendar()
在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
2GregorianCalendar(int year, int month, int date)
在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar
3GregorianCalendar(int year, int month, int date, int hour, int minute)
为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
4GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
  为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
5GregorianCalendar(Locale aLocale)
在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。
6GregorianCalendar(TimeZone zone)
在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
7GregorianCalendar(TimeZone zone, Locale aLocale)
 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。

常用方法

序号方法和说明
1void add(int field, int amount)
根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。
2protected void computeFields()
转换UTC毫秒值为时间域值
3protected void computeTime()
覆盖Calendar ,转换时间域值为UTC毫秒值
4boolean equals(Object obj)
比较此 GregorianCalendar 与指定的 Object。
5int get(int field)
获取指定字段的时间值
6int getActualMaximum(int field)
返回当前日期,给定字段的最大值
7int getActualMinimum(int field)
返回当前日期,给定字段的最小值
8int getGreatestMinimum(int field)
 返回此 GregorianCalendar 实例给定日历字段的最高的最小值。
9Date getGregorianChange()
获得格里高利历的更改日期。
10int getLeastMaximum(int field)
返回此 GregorianCalendar 实例给定日历字段的最低的最大值
11int getMaximum(int field)
返回此 GregorianCalendar 实例的给定日历字段的最大值。
12Date getTime()
获取日历当前时间。
13long getTimeInMillis()
获取用长整型表示的日历的当前时间
14TimeZone getTimeZone()
获取时区。
15int getMinimum(int field)
返回给定字段的最小值。
16int hashCode()
重写hashCode.
17boolean isLeapYear(int year)
确定给定的年份是否为闰年。
18void roll(int field, boolean up)
在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
19void set(int field, int value)
用给定的值设置时间字段。
20void set(int year, int month, int date)
设置年、月、日的值。
21void set(int year, int month, int date, int hour, int minute)
设置年、月、日、小时、分钟的值。
22void set(int year, int month, int date, int hour, int minute, int second)
设置年、月、日、小时、分钟、秒的值。
23void setGregorianChange(Date date)
设置 GregorianCalendar 的更改日期。
24void setTime(Date date)
用给定的日期设置Calendar的当前时间。
25void setTimeInMillis(long millis)
用给定的long型毫秒数设置Calendar的当前时间。
26void setTimeZone(TimeZone value)
用给定时区值设置当前时区。
27String toString()
返回代表日历的字符串。

JDK8中新日期时间API

新日期时间API出现的背景

如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:
        可变性:像日期和时间这样的类应该是不可变的。
        偏移性:Date中的年份是从1900开始的,而月份都从0开始。
        格式化:格式化只对Date有用,Calendar则不行。
        此外,它们也不是线程安全的;不能处理闰秒等。

第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。

新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。

java.time包含值对象的基础包
java.time.chrono提供对不同的日历系统的访问
java.time.format格式化和解析时间和日期
java.time.temporal包括底层框架和扩展特性
java.time.zone包含时区支持的类

LocalDate、LocalTime、LocalDateTime 类

LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期
LocalTime表示一个时间,而不是日期
LocalDateTime用来表示日期和时间的,这是一个最常用的类之一

方法描述

方法描述
now() / * now(ZoneId zone)静态方法,根据当前时间创建对象/指定时区的对象
of()静态方法,根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear()获得月份天数(1-31) /获得年份天数(1-366)
getDayOfWeek()获得星期几(返回一个 DayOfWeek 枚举值)
getMonth()获得月份, 返回一个 Month 枚举值
getMonthValue() / getYear()获得月份(1-12) /获得年份
getHour()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/ withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()向当前对象添加几天、几周、几个月、几年、几小时
minusMonths() / minusWeeks()/ minusDays()/minusYears()/minusHours() 从当前对象减去几月、几周、几天、几年、几小时

Instant类

Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。

java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。

概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。(1 ns = 10-9 s) 1秒 = 1000毫秒 =10^6微秒=10^9纳秒。

方法描述

方法描述
now()静态方法,返回默认UTC时区的Instant类的对象
ofEpochMilli(long epochMilli)静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
atOffset(ZoneOffset offset)结合即时的偏移来创建一个 OffsetDateTime
toEpochMilli()返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳

java.time.format.DateTimeFormatter类

预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

方法描述

方法描述
ofPattern(String pattern)静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t)格式化一个日期、时间,返回字符串
parse(CharSequence text)将指定格式的字符序列解析为一个日期、时间

其它API

ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等 。 

Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

Duration:持续时间,用于计算两个“时间”间隔

Period:日期间隔,用于计算两个“日期”间隔

TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。

TemporalAdjusters : 通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx()) 提供了大量的常用TemporalAdjuster 的实现。
 

与传统日期处理的转换

To 遗留类From 遗留类
java.time.Instant与java.util.DateDate.from(instant)date.toInstant()
java.time.Instant与java.sql.TimestampTimestamp.from(instant)timestamp.toInstant()
java.time.ZonedDateTime与
java.util.GregorianCalendar

GregorianCalendar

.from(zonedDateTime)

cal.toZonedDateTime()
java.time.LocalDate与java.sql.TimeDate.valueOf(localDate)date.toLocalDate()
java.time.LocalTime与java.sql.TimeDate.valueOf(localDate)date.toLocalTime()
java.time.LocalDateTime与
java.sql.Timestamp

Timestamp

.valueOf(localDateTime)

timestamp

.toLocalDateTime()

java.time.ZoneId与java.util.TimeZoneTimezone.getTimeZone(id)timeZone.toZoneId()
java.time.format.DateTimeFormatter与
java.text.DateFormat
formatter.toFormat()


 

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

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

相关文章

SCA Sentinel分布式系统的流量防卫兵

Sentinel官网:https://sentinelguard.io/zh-cn Sentinel:Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户 保障微服务的稳定性 Sentinel与Hystrix对…

http连接处理(下)(四)

1.结合代码分析请求报文响应 下面我们将介绍服务器如何响应请求报文,并将该报文发送给浏览器端。首先介绍一些基础API,然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分,介绍stat、mmap、iovec、writev。 流程图部分&…

NodeJS 后端通过Http获取Base64格式数据显示图片 ②〇

文章目录 前言BASE64前端开发后端开发异步代码效果总结 ⡖⠒⠒⠒⠤⢄⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸ ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀…

Rust操作MySQL

查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库: chrono 流式查询使用: query_iter 输出到Vec使用: query 映射到结构体使用: query_map 获取单条数据使用: query_first 命名…

RTP及RTP Header Extension

https://www.rfc-editor.org/rfc/rfc3550.txt 译文: http://www.gpssoft.cn/download/protocol/RFC-3550-%E4%B8%AD%E6%96%87%E7%89%88.pdf RTP:real-time transport protocol,实时传输协议 每一个 RTP 包中都有前 12 个字节,而…

了解PostgreSQL sql shell和VACUUM命令

从SQL Shell进入PostgreSQL;没用过这东西,看一下; 一直回车;最后输入口令就登入了;此时是登入默认的数据库postgres;这个数据库是默认安装的; 看一下有没有表,根据资料可以用 \d 或…

K210学习篇(五)PWM

machine.PWM PWM: 脉宽调制模块, 硬件支持的PWM, 可以指定任意引脚(0到47引脚) 每个 PWM 依赖于一个定时器, 即当定时器与 PWM 功能绑定后, 不能作为普通定时器使用了。 因为有 3 个定时器&…

go语言终端交叉编译的事项

一、可以使用的编译环境 go env 查看编译的环境 1.编译linux 64环境[centos7以及以上版本] go env -w GOOS"linux" go env -w GOARCH"amd64" 2.编译linux 32环境[centos6以及以下版本] go env -w GOOS"linux" go env -w GOARCH"386"…

动态库 的制作和使用

文章目录 重要命令制作流程和使用动态库加载失败&解决失败的原因:ldd命令系统加载动态库(共享库)的顺序问题解决途径一、修改环境变量二、修改/etc/ld.so.cache文件列表三、将动态库放在/lib 或 /usr/lib文件中(不推荐&#x…

互联网大厂技术-Redis-集群模型、架构原理、难点应用场景、高频面试问题详解

目录 一、Redis集群模型 1.1、主从模式 1.1.1 主从模式优缺点 1.2、哨兵模式 1.2.1 哨兵模式的作用: 1.2.2 哨兵实现原理 1.2.3 主观下线和客观下线 1.2.4 哨兵模式优缺点 1.3、各大厂的Redis集群方案 1.3.1 客户端分片 1.3.2 代理分片 Twemproxy的优点…

ESP32开发环境的搭建

ESP32开发环境的搭建 Windows11WSL2 Ubuntu22.04 下载ESP32开发所需的库和工具链 下载ESP-IDF库安装必要的工具sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial python-click python-cryptography python-future python…

收款单签字时,报”结算信息表体中本方银行账户、现金账户、票据号 (商业汇票号)不能同时为空,签字操作失败“,能否取消这个校验??

大概整理,如有不当,欢迎留言指出,谢谢! 收款单签字时,报”结算信息表体中本方银行账户、现金账户、票据号 (商业汇票号)不能同时为空,签字操作失败“,能否取消这个校验?&#xff1f…

设计模式(六)-----适配器模式(Adapter Pattern)

目录 什么是适配器模式适用场景适配器模式的三种实现方式1. 类的适配器模式2. 对象的适配器模式3. 接口的适配器模式 总结 什么是适配器模式 适配器模式主要用于将一个类的接口转化成客户端希望的目标类格式,使得原本不兼容的类可以在一起工作,将目标类…

2023年7月北京/广州/深圳制造业产品经理NPDP认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

Windows 10 实现实时文件夹同步的方法

什么是实时同步? 实时文件夹同步是一种确保在满足一定条件时立即更新一个或多个文件夹的过程。与传统的文件同步方法相比,它能够更及时地检测到源文件夹的变化并将这些变化快速复制到目标文件夹。 实时文件夹同步可以采用单向同步或双向同步的模式…

Flutter 状态管理框架 Provider 和 Get 分析

状态管理一直是 Flutter 开发中一个火热的话题。谈到状态管理框架,社区也有诸如有以Get、Provider为代表的多种方案,它们有各自的优缺点。面对这么多的选择,你可能会想:「我需要使用状态管理么?哪种框架更适合我&#…

数据安全之风险评估(三)

网络数据安全风险评估坚持预防为主、主动发现、积极防范,对数据处理者数据安全保护和数据处理活动进行风险评估,旨在掌握数据安全总体状况,发现数据安全隐患,提出数据安全管理和技术防护措施建议,提升数据安全防攻击、…

ElasticSearch简单介绍以及基本概念阐述

文章目录 一、ES是什么二、ES主要功能1、实时数据搜索和分析:2、分布式架构:3、全文搜索:4、实时数据分析:5、多种数据类型支持:6、实时监控和可视化:7、安全性和访问控制:8、多种集成和扩展&am…

java-error-No converter found for return value of type

java-error-No converter found for return value of type 问题描述 : 日志如下 : 14-Jul-2023 15:27:46.747 严重 [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke 在路径为[]的上下文中,Servlet[action]的…

掘金量化—Python SDK文档—3.变量约定

目录 Python SDK文档 3.变量约定 3.1 symbol - 代码标识 3.1.1交易所代码 3.1.2交易标的代码 3.1.3symbol 示例 3.1.4期货主力连续合约 3.2mode - 模式选择 3.2.1实时模式 3.2.2回测模式 3.3context - 上下文对象 3.3.1context.symbols - 订阅代码集合 3.3.2context.now - 当…