<导航

Java8 日期时间API

一、转换

1、转字符串

1.1、LocalDateTime与字符串

//LocalDateTime 转 字符串
String str = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
//字符串 转 LocalDateTime 
 LocalDateTime localDateTime = LocalDateTime.parse("2019-06-26 19:00:00",
                                          DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

1.2、LocalDate与字符串

/**
  * String转LocalDate
  * @param dateStr        日期的字符串
  * @param pattern        格式示例: yyyy-MM-dd
  * @return
  */
public static LocalDate toLocalDate(String dateStr, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return LocalDate.parse(dateStr, formatter);
}

/**
  * LocalDate转String
  * @param localDate   localDate对象
  * @param pattern        格式示例: yyyy-MM-dd
  * @return
  */
public static String LocalDatetoStr(LocalDate localDate, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return localDate.format(formatter);
}

2、与Date

// Date 转 LocalDateTime 与 LocalDate
Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
//也可以使用LocalDateTime的FactoryInput()方法使用系统的默认时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), zoneId);
------------------------------------------------------------------------------------------------
// LocalDateTime 转换成 Date
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
// LocalDate 转换成 Date
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
Date date = Date.from(zdt.toInstant());

3、LocalDateTime 转 LocalDate

LocalDateTime now = LocalDateTime.now();
LocalDate localDate = now.toLocalDate();

二、比较

String time1 = "2019-06-26 19:00:00";
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(time1, dtf2);
System.out.println(localDateTime.isBefore(LocalDateTime.now()));//如果你的时间在当前时间之前,那么就是true
System.out.println(localDateTime.isAfter(LocalDateTime.now()));//反之是否在当前时间之后就是false

三、计算日期时间差

在Java8中,我们可以使用以下类来计算日期时间差异:

1.Period
2.Duration
3.ChronoUnit

1、Period类

主要是Period类方法getYears(),getMonths()和getDays()来计算.

示例:

import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
public class Test {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("Today : " + today);
        LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);
        System.out.println("BirthDate : " + birthDate);
        Period p = Period.between(birthDate, today);
        System.out.printf("年龄 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());
    }
}

结果:

Today : 2017-06-16
BirthDate : 1993-10-19
年龄 : 23 年 7 月 28 日

2、Duration类

提供了使用基于时间的值(如秒,纳秒)测量时间量的方法。

示例:

LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(now,now);
    long days = duration.toDays(); //相差的天数
    long hours = duration.toHours();//相差的小时数
    long minutes = duration.toMinutes();//相差的分钟数
    long millis = duration.toMillis();//相差毫秒数
    long nanos = duration.toNanos();//相差的纳秒数
    System.out.println(millis);

3、ChronoUnit类

ChronoUnit类可用于在单个时间单位内测量一段时间,例如天数或秒。以下是使用between()方法来查找两个日期之间的区别的示例。

示例:

public static void main(String[] args) {
    String str1 = "2019-11-18 12:10:01";
    String str2 = "2019-11-18 14:12:09";
    LocalDateTime date1 = LocalDateTime.parse(str1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    LocalDateTime date2 = LocalDateTime.parse(str2, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

    Duration duration = Duration.between(date1, date2);
    System.out.println(duration);
    long days = duration.toDays(); //相差的天数
    long hours = duration.toHours();//相差的小时数
    long minutes = duration.toMinutes();//相差的分钟数
    long seconds = duration.toMillis() / 1000;//相差秒数
    System.out.println(String.format("%s小时%s分%s秒", hours, minutes - hours * 60, seconds - minutes * 60));

    System.out.println("-----------------------------------------");
    long d = ChronoUnit.DAYS.between(date1, date2);  //相差的天数
    long h = ChronoUnit.HOURS.between(date1, date2); //相差的小时数
    long m = ChronoUnit.MINUTES.between(date1, date2); //相差的分钟数
    long s = ChronoUnit.SECONDS.between(date1, date2); //相差秒数
    System.out.println(String.format("%s小时%s分%s秒", h, m - h * 60, s - m * 60));
}

输出结果:

PT2H2M8S
2小时2分8秒
-----------------------------------------
2小时2分8秒

Process finished with exit code 0

注:严格间隔不足24小时的相差天数会得到0,如果不考虑具体的时分秒可转换为LocalDate类型再求值。

四、日期格式化

JDK8之前:SimpleDateFormat来进⾏格式化,但SimpleDateFormat并不是线程安全的

JDK8之后:引⼊线程安全的⽇期与时间DateTimeFormatter

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String ldtStr = dtf.format(ldt);
System.out.println(ldtStr);

获取指定的⽇期时间对象

LocalDateTime ldt = LocalDateTime.of(2020, 11, 11, 8, 20, 30);
System.out.println(ldt);

五、常用API

public static void main(String[] args) throws InterruptedException {
        System.out.println("当前日期:");
        LocalDate currentDate = LocalDate.now();
        System.out.println(currentDate);
        System.out.println("----------------------------------");
        System.out.println("当前日期的周一与周日:");
        LocalDate monday = currentDate.with(DayOfWeek.MONDAY);
        LocalDate sunday = currentDate.with(DayOfWeek.SUNDAY);
        System.out.println(monday + " 与 " + sunday);
        System.out.println("----------------------------------");
        System.out.println("当天周日期:");
        String currentDayOfWeek = currentDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINA);
        System.out.println(currentDayOfWeek);
        System.out.println(currentDate.getDayOfWeek().getValue());
        System.out.println("----------------------------------");
        System.out.println("当月第一天日期:");
        LocalDate firstDayOfMonth = currentDate.with(TemporalAdjusters.firstDayOfMonth());
        System.out.println(firstDayOfMonth);
        System.out.println("----------------------------------");
        System.out.println("当月最后一天日期:");
        LocalDate lastDayOfMonth = currentDate.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println(lastDayOfMonth);
        System.out.println("----------------------------------");
        System.out.println("当月最后一天周日期:");
        String lastDayOfWeek = lastDayOfMonth.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINA);
        System.out.println(lastDayOfWeek);
        System.out.println("----------------------------------");
        System.out.println("当前日期后天周日期(数字):");
        System.out.println(currentDate.plusDays(2).getDayOfWeek().getValue());
        System.out.println("----------------------------------");
        System.out.println("当天开始时间与结束时间:");
        System.out.println(LocalDate.now().atStartOfDay());
        System.out.println(LocalDate.now().atTime(LocalTime.MIN));
        System.out.println(LocalDate.now().atTime(LocalTime.MAX));
    }

 

注:

System.out.println(LocalDate.now().atTime(LocalTime.MIN));

System.out.println(LocalDate.now().atTime(LocalTime.MAX));

如果是LocalDateTime类型需使用下面API达到相同效果

LocalDateTime.now().with(LocalTime.MIN)

LocalDateTime.now().with(LocalTime.MAX);

//手动设置具体时分秒

LocalDateTime.of(LocalDate.now(),LocalTime.of(10,0,0));

或者:

LocalDate.now().atTime(LocalTime.of(10,0,0));

 扩展:

TemporalAdjuster:时间矫正器

  有时我们可能需要获取一个周末,或者下一个工作日等时间,这里 java8 就为我们提供了一个时间校正器,让我们对时间进行校准。

  TemporalAdjusters:该类通过静态方法提供了大量的常用的TemporalAdjuster的实现供我们使用。

  在localDateTime中,有一个with方法,其中可以让我们去写一TemporalAdjuster接口,而TemporalAdjusters类中,有许多常用的方法

TemporalAdjusters 包含许多静态方法,可以直接调用,以下列举一些:

方法名描述
dayOfWeekInMonth 返回同一个月中每周的第几天
firstDayOfMonth 返回当月的第一天
firstDayOfNextMonth 返回下月的第一天
firstDayOfNextYear 返回下一年的第一天
firstDayOfYear 返回本年的第一天
firstInMonth 返回同一个月中第一个星期几
lastDayOfMonth 返回当月的最后一天
lastDayOfNextMonth 返回下月的最后一天
lastDayOfNextYear 返回下一年的最后一天
lastDayOfYear 返回本年的最后一天
lastInMonth 返回同一个月中最后一个星期几
next / previous 返回后一个/前一个给定的星期几
nextOrSame / previousOrSame 返回后一个/前一个给定的星期几,如果这个值满足条件,直接返回

 

 

参考文章:

https://blog.csdn.net/qq_44749491/article/details/130123065

posted @ 2019-11-22 15:55  字节悦动  阅读(294)  评论(0编辑  收藏  举报