概述
在jdk8之前经常使用到的时间API包括(Date、Calendar),date与字符串之间的转换使用SimpleDateFormat进行转换,用SimpleDateFormat类的parse方法,可以将满足格式要求的字符串转换成Date对象,使用SimpleDateFormat类的format方法,可以将Date类型的对象转换成一定格式的字符串。然而SimpleDateFormat并非是线程安全的。在jdk8中为了使用时间更加便利,在java.time包下新增时间API。使用DateTimeFormatter的parse将字符串转换成时间格式,format方法将日期、时间转换成字符串格式。
1.1、时间API
-
ZoneId:时区ID,用来确定Instant和LocalDateTime互相转换的规则。
-
Instant:用来表示时间线上的一个点。
-
LocalDate:表示没有时区的日期,LocalDate是不可变且线程安全的。
-
LocalTime:表示没有时区的时间,LocalTime是不可变且线程安全的。
-
LocalDateTime:表示没有时区的日期时间,LocalDateTime是不可变且线程安全的。
-
Clock:用于访问当前时刻、日期、时间、用到时区。
-
Duration:用秒和纳秒表示时间。
最常用的就是LocalDate、LocalTime、LocalDateTime了、从他们的名字可以看出是操作日期、时间的。
LocalDate(日期)
说明 | 方法 | 返回结果示例 |
---|---|---|
获取当前日期 | LocalDate.now() | 2019-05-14 |
日期构造 | LocalDate.of(2019,05,14) | 2019-05-14 |
字符串转LocalDate | LocalDate.parse("2019-06-01") | 2019-06-01 |
获取明天的日期 | LocalDate.now().plusDays(1) / LocalDate.now().plus(1, ChronoUnit.DAYS) | 2019-05-15 |
在今天的基础上减去一个月 | LocalDate.now().minusMonths(1)/LocalDate.now().minus(1, ChronoUnit.MONTHS) | 2019-04-14 |
解析日期,获取星期 | LocalDate.parse("2019-05-14").getDayOfWeek() | TUESDAY |
解析日期,获取本月的第几天 | LocalDate.parse("2019-05-14").getDayOfMonth() | 14 |
判断今年是否为闰年 | LocalDate.now().isLeapYear() | false |
获取本月的第一天 | LocalDate.parse("2019-05-14").with(TemporalAdjusters.firstDayOfMonth()) | 2019-05-01 |
LocalTime(时间)
说明 | 方法 | 示例 |
---|---|---|
获取当前时间 | LocalTime.now() | 20:46:15.170 |
时间构造 | LocalTime.of(17,30,14) | 17:30:14 |
字符串时间解析为LocalTime | LocalTime.parse("17:30") | 17:30 |
获取小时 | LocalTime.now().getHour() | 20 |
获取分钟 | LocalTime.now().getMinute() | 46 |
判断一个时间是否在另一时间之前 | LocalTime.parse("17:30").isBefore(LocalTime.parse("17:29")) | false |
判断一个时间是否在另一时间之后 | LocalTime.parse("17:30").isAfter(LocalTime.parse("17:29")) | true |
每天的开始 | LocalTime.MIN | 00:00 |
每天的结束 | LocalTime.MAX | 23:59:59.999999999 |
LocalDateTime(日期时间,可通过getXX获取年月日时分秒)
说明 | 方法 | 示例 |
---|---|---|
获取当前日期的时间 | LocalDateTime.now() | 2019-05-14T20:57:18.094 |
日期时间构造 | LocalDateTime.of(2019,05,14,17,30,14) | 2019-05-14T17:30:14 |
日期时间加1天 | LocalDateTime.now().plusDays(1) | 2019-05-15T20:57:18.094 |
日期时间减1天 | LocalDateTime.now().minusDays(1) | 2019-05-13T20:57:18.094 |
Instant(时间戳)
说明 | 方法 | 示例 |
---|---|---|
当前UTC时区 | Instant.now() | 2019-05-14T13:10:33.982Z |
东八区 | Instant.now().atOffset(ZoneOffset.ofHours(8)) | 2019-05-14T21:10:34.022+08:00 |
获取毫秒值 | Instant.now().toEpochMilli() | 1557839434023 |
通过毫秒获取时间(UTC时区) | Instant.ofEpochMilli(1) | 1970-01-01T00:00:00.001Z |
通过时区ID获取时间 | LocalDateTime.now(ZoneId.of("Europe/London")) | 2019-05-14T14:10:34.030 |
比较两个日期的差别 | ChronoUnit.DAYS.between(temporal1,temporal2) | 相差的天数 |
DateTimeFormatter(时间与字符串之间的转换)
说明 | 方法 | 示例 |
---|---|---|
转换格式 | DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS") | |
字符串转LocalDateTime | LocalDateTime.parse("2019-05-14 21:15:30.555",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")) | 2019-05-14T21:15:30.555 |
LocalDateTime转字符串 | DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(LocalDateTime.now()) | 2019-05-14 21:18:22.902 |
各时间与Date之间互转
说明 | 方法 | 示例 |
---|---|---|
Date转换为LocalDateTime | Date.from(Instant.now()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime() | 2019-05-14T21:43:57.650 |
LocalDateTime转Date | Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()) | Tue May 14 21:43:57 CST 2019 |
LocalDate转Date | Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()) | Tue May 14 00:00:00 CST 2019 |
Date转字符串 | DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(Date.from(new Date().toInstant()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()) | 2019-05-14 21:43:57.706 |
最后
以上就是平常黑夜为你收集整理的JDK8时间API整理的全部内容,希望文章能够帮你解决JDK8时间API整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复