前言:

JDK8是java中具有里程碑意义的一个版本,在这个版本中增加Stream流,Lambda表达式和关于时间的LocalDate、LocalTime、LocalDateTime类。它们极大方便我们对java语言的运用,下面,我们就来介绍一下JDK8时间类的使用。

正文:

一、LocalDate类、LocalTime类、LocalDateTime类的使用:

LocalDate类、LocalTime类、LocalDateTime类这三个类大部分方法是一样的,以下文章大部分使用LocalDate类举例说明其用法。

1. 获取当前日期:

static LocalDate now() 从系统时钟获取现在时间

LocalDate localDate = LocalDate.now();

 2. String转Date:

static LocalDate parse(CharSequence text) 字符串解析日期,默认格式yyyy-MM-dd

String DateStr1="2019-04-10";
LocalDate analyseDate1 = LocalDate.parse(DateStr1);

static LocalDate parse(CharSequence text , DateTimeFormatter formatter) 

String DateStr2="20190410";
LocalDate analyseDate2 = LocalDate.parse(DateStr2, DateTimeFormatter.BASIC_ISO_DATE);

 3. 设置日期:

LocalDate setDate = LocalDate.of(2020, 09, 04);

 4. DateTime转String:

String format(DateTimeFormatter formatter)

LocalDate localDate = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
String formatDate = dtf.format(localDate);

5. 获取日期对象中的年,月,日:

int getYear()  ,获取日期对象的年

int year = localDate.getYear();

Month getMonth(),获取日期对象的月的英文

Month mouth = localDate.getMonth();

int getMonthValue(), 获取日期对象的月

int month = localDate.getMonthValue();

int getDayOfMonth(),  获取日期对象在它的月中是第几天

int day = localDate.getDayOfMonth();

 int getDayOfYear() , 获取日期对象在它那一年是第几天的月中是第几天

int day = localDate.getDayOfYear();

int getDayOfWeek(), 获取日期对象的星期

int day = localDate.getDayOfWeek();

String toString() 获取字符串类型的日期,例如:2020-09-04

String date = localDate.toString();

6. 判断方法:

boolean isLeapYear(),判断日期对象所在的年是否为闰年

boolean flag = localDate.isLeapYear();

boolean isBefore(LocalTime other) ,判断是否在给定时间对象之前

boolean flag = localDate.isBefore(analyseDate1);

 boolean isAfter(LocalTime other),判断是否在给定时间对象之后

boolean flag =  localDate.isAfter(analyseDate1);

boolean isEqual(ChronoLocalDate other),判断是否在给定时间对象是否相等

boolean flag =localDate.isEqual(analyseDate1);

7. 设置一段时间后的日期:

 LocalDate plus(long amountToAdd, TemporalUnit unit) ,返回当前对象加上一定日期后的新的日期对象,第一个参数是多少,第二个参数是单位

当前日期对象两天后的日期: localDate.plus(2, ChronoUnit.DAYS)
当前日期对象两天前的日期: localDate.plus(-2, ChronoUnit.DAYS)
当前日期对象一周后的日期: localDate.plus(1, ChronoUnit.WEEKS)
当前日期对象一周前的日期: localDate.plus(-1, ChronoUnit.WEEKS)

 LocalDate plusDays(long daysToAdd),返回当前对象加上一些天数后的新的日期对象

当前日期对象一天前的日期: localDate.plusDays(-1)

 LocalDate plusWeeks(long weeksToAdd), 返回当前对象加上一些周数后的新的日期对象

当前日期对象一周前的日期: localDate.plusWeeks(-1)

LocalDate plusMonths(long monthsToAdd),返回当前对象加上一些月数后的新的日期对象

当前日期对象一月前的日期: localDate.plusMonths(-1)

LocalDate plusYears(long yearsToAdd),返回当前对象加上一些年数后的新的日期对象

当前日期对象一年前的日期: localDate.plusYears(-1)

8.修改日期返回新的日期:

  LocalDate withMonth(int month) ,修改日期的月

修改日期的月,改成3月:localDate.withMonth(3)

LocalDate withYear(int year),修改日期的年

修改日期的年,改成2018年:localDate.withYear(2018)

LocalDate withDayOfMonth(int dayOfMonth),修改成当月的第几日

修改成当月的第2日:localDate.withDayOfMonth(2)

LocalDate withDayOfYear(int dayOfYear),修改成当年的第几日

修改成当年的第2日:localDate.withDayOfYear(2)

二、Duration类:

用来计算两个LocalTime对象或者两个两个LocalDateTime对象之间相差的时间,这里用LocalDateTime 来举例说明。

LocalDateTime localDateTime1 = LocalDateTime.of(2020, 09, 04, 12, 32, 16); 
LocalDateTime localDateTime2 = LocalDateTime.of(2020, 09, 02, 12, 32, 16);

static Duration between(Temporal startInclusive, Temporal endExclusive),根据两个LocalTime或者两个LocalDateTime创建Duration对象,参数,前小后大算出来正数,否则算出来负数

Duration duration = Duration.between(localDateTime1, localDateTime2); 
将差值转换为天数返回: duration.toDays())
将差值转换为小时数返回: duration.toHours()
将差值转换为分钟数返回: duration.toMinutes()
Duration对象转换成的秒数: duration.getSeconds()
将差值转换为毫秒数返回:  duration.toMillis()

三、Period类:

用来计算两个LocalDate相差的时间

LocalDate localDate1 = LocalDate.of(2019, 02, 17);
LocalDate localDate2 = LocalDate.of(2020, 04, 16);

static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive),根据给定的两个LocalDate对象创建Period对象,参数前小后大,算出来的为正,否则算出来负数

Period period = Period.between(localDate1, localDate2);
返回两个localDate年的相差数: period.getYears()
返回两个localDate月的相差数: period.getMonths()
返回两个localDate天的相差数: period.getDays()

四、ZoneId类:

获取本时区时间

ZonedDateTime zdt1 = ZonedDateTime.now();

修改时区为美国的印第安纳州

ZoneId zoneChanged = ZoneId.of("US/East-Indiana");

获取指定时区的时间,调用重载的now方法

ZonedDateTime zdt2 = ZonedDateTime.now(zoneChanged);

五、Instant类 :

时间线上的一个瞬时点,这可能用于记录应用程序的事件时间戳,Instant的精度可以达到纳秒级

1.获取本初子午线的标准时间:

Instant instant = Instant.now();

 2.东八区的时间 偏移量:

OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));

3.距离1970年1月1日0:0:0(UTC)开始的毫秒数:

long nanos = instant.toEpochMilli();

4.根据偏移量获取时间:

Instant instantDate = Instant.ofEpochMilli(nanos);

六、Date与LocalDateTime相互转换:

1.Date <--> LocalDateTime:

ZoneId zone = ZoneId.systemDefault();
java.util.Date date = new java.util.Date();
Instant instant1 = date.toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant1, zone);

2. LocalDateTime <--> Date: 

ZoneId zone = ZoneId.systemDefault();
LocalDateTime  localDateTimeNow = LocalDateTime.now();
Instant instant2 = localDateTimeNow.atZone(zone).toInstant();
java.util.Date date = Date.from(instant2);

七、LocalDate、LocalTime、LocalDateTime之间转换:

1.LocalDateTime-->LocalDate :

LocalDate localDate = localDateTime3.toLocalDate();

2.LocalDateTime-->LocalTime:

LocalTime localTime = localDateTime3.toLocalTime();

3.LocalDate、LocalTime-->LocalDateTime:

LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.now());