JDK8时间API整理

在jdk8之前经常使用到的时间API包括(Date、Calendar),date与字符串之间的转换使用SimpleDateFormat进行转换,用SimpleDateFormat类的parse方法,可以将满足格式要求的字符串转换成Date对象,使用SimpleDateFormat类的format方法,可以将Date类型的对象转换成一定格式的字符串。然而SimpleDateFormat并非是线程安全的。在jdk8中为了使用时间更加便利,在java.time包下新增时间API。使用DateTimeFormatter的parse将字符串转换成时间格式,format方法将日期、时间转换成字符串格式。

1.1、时间API

  1. ZoneId:时区ID,用来确定Instant和LocalDateTime互相转换的规则。

  2. Instant:用来表示时间线上的一个点。

  3. LocalDate:表示没有时区的日期,LocalDate是不可变且线程安全的。

  4. LocalTime:表示没有时区的时间,LocalTime是不可变且线程安全的。

  5. LocalDateTime:表示没有时区的日期时间,LocalDateTime是不可变且线程安全的。

  6. Clock:用于访问当前时刻、日期、时间、用到时区。

  7. Duration:用秒和纳秒表示时间。

最常用的就是LocalDate、LocalTime、LocalDateTime了、从他们的名字可以看出是操作日期、时间的。

LocalDate日期

说明方法返回结果示例
获取当前日期LocalDate.now()2019-05-14
日期构造LocalDate.of(2019,05,14)2019-05-14
字符串转LocalDateLocalDate.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
字符串时间解析为LocalTimeLocalTime.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.MIN00:00
每天的结束LocalTime.MAX23: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") 
字符串转LocalDateTimeLocalDateTime.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转换为LocalDateTimeDate.from(Instant.now()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()2019-05-14T21:43:57.650
LocalDateTime转DateDate.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant())Tue May 14 21:43:57 CST 2019
LocalDate转DateDate.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值