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