Java8时间和日期API
Posted 我永远信仰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8时间和日期API相关的知识,希望对你有一定的参考价值。
时间和日期API(记录下来当成字典查用了)
旧版日期时间API存在的问题
-
设计很差:在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。此外用于格式化和解析的类在java.text包中定义。
-
非线程安全: java.util.Date是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
-
时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和
java.util.TimeZone类,但他们同样存在上述所有的问题。
新日期时间API介绍
JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于java.time包中,下面是一些关键类。
Loca1Date
:表示日期,包含年月日,格式为2019-10-16
LocalTime
:表示时间,包含时分秒,格式为16:38:54.158549300
LocalDateTime
:表示日期时间,包含年月日,时分秒,格式为2018-09-06T15:33:56.750
DateTimeFormatter
:日期时间格式化类。
lnstant
:时间戳,表示—个特定的时间瞬间。
Duration
:用于计算2个时间(LocalTime,时分秒)的距离Period:用于计算2个日期(LocalDate,年月日)的距离
ZonedDateTime
:包含时区的时间
掌握JDK 8的日期和时间类
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test01
public static void main(String[] args)
//LocalDate 表示日期,不包含时分秒
LocalDate now = LocalDate.now();//获取当前日期,不用new
System.out.println(now);//2021-08-25
System.out.println(now.getYear());//2021
System.out.println(now.getMonthValue());//获取月
System.out.println(now.getDayOfMonth());//获取这个月的多少号
System.out.println(now.getDayOfWeek());//获取星期几
System.out.println(now.getDayOfYear());//获取是这一年的第几天,可以用来计算你和女朋友的纪念日
//LocalTime:表示时间,包含时分秒 毫秒
LocalTime localTime =LocalTime.now();
System.out.println(localTime);//14:15:26.262
System.out.println(localTime.getNano());//获取纳秒
//LocalDateTime:表示日期时间,包含上面两个
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);//2021-08-25T14:18:37.586
System.out.println(dateTime.withYear(2000));//2000-08-25T14:21:21.634 ,修改年
//增加plus或减少minus时间
System.out.println(dateTime.plusYears(6));//2027-08-25T14:22:42.672
System.out.println(dateTime.minusYears(6));//2015-08-25T14:23:34.188
/**
* 比较时间
* isAfter()
* isBefore()
* isEqual()
*/
掌握JDK8的时间格式化与解析
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test02
public static void main(String[] args)
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);//2021-08-25T14:39:34.908
//JDK自带的格式
DateTimeFormatter isoDate = DateTimeFormatter.ISO_LOCAL_DATE;
System.out.println(dateTime.format(isoDate));//2021-08-25
//自定义格式
//1.定义自定义格式,
String format="yyyy年MM月dd日 HH:mm:ss";
//2.获得这个格式,
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
//3.格式化
String timeString = dateTime.format(dtf);
System.out.println(timeString);//2021年08月25日 14:43:41
//解析格式化的时间,反解析
LocalDateTime parse = LocalDateTime.parse(timeString,dtf);
System.out.println(parse);//2021-08-25T14:43:41
掌握JDK 8的Instant时间戳
instant内部保存了秒,一般不是给用户用的,而是方便我们程序做一些统计的
使用方法差不多,有加减、获取时分秒、毫秒、纳秒
了解JDK 8的计算日期时间差类
Duration、Period类。
package com.yong.time;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
public class Test03
public static void main(String[] args)
LocalTime now = LocalTime.now();
LocalTime time = LocalTime.of(11, 20, 30);
//Duration计算时间的距离
Duration duration = Duration.between(time, now);
System.out.println(duration);
System.out.println("相差的天数"+duration.toDays());
System.out.println("相差的小时数"+duration.toHours());
System.out.println("相差的分钟数"+duration.toMinutes());
System.out.println("相差的毫秒数"+duration.toMillis());
//Period计算日期的距离,后面的减去前面的。
LocalDate now1 = LocalDate.now();
LocalDate date = LocalDate.of(11, 11, 11);
Period period = Period.between(date,now1);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
了解JDK8设置日期时间的时区
Java8中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为: ZonedDate、ZonedTime、ZonedDateTime。
其中每个时区都对应着ID,ID的格式为“区域/城市”。例如:Asia/Shanghai 等。
zoneld:该类中包含了所有的时区信息。
import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test04
public static void main(String[] args)
//获取所有时区
ZoneId.getAvailableZoneIds().forEach(System.out::println);
//获取不带时区的时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2021-08-25T15:22:27.004
//获取世界标准时间
ZonedDateTime dateTime = ZonedDateTime.now(Clock.systemUTC());
System.out.println(dateTime);//2021-08-25T07:26:43.917Z
//获取带时区的时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);//2021-08-25T15:22:27.004+08:00[Asia/Shanghai]
// 上海的时间
// +08:00表示于标准的时间时间之差
//使用指定的时区 创建时间
ZonedDateTime time = ZonedDateTime.now(ZoneId.of("America/Vancouver"));//温哥华
System.out.println(time);//2021-08-25T00:25:01.018-07:00[America/Vancouver]
以上是关于Java8时间和日期API的主要内容,如果未能解决你的问题,请参考以下文章
《Java8实战》读书笔记11:Java8中新的日期时间API
《Java8实战》读书笔记11:Java8中新的日期时间API