Java8的LocalDate例子及解释

317 阅读4分钟

在这篇博文中,我们将学习java.util.LocalDate类的10个例子。

LocalDate在java8语言中作为DateTime API的一部分被引入。ISO format 它代表了Date ,而没有timezone ,也就是YYYY-MM-DD 的信息。

它被用来存储日期,如生日和假期。

本地日期只包含年月日,尽管其他字段如

java.util.Localdate实现了以下接口

  • 可序列化的
  • 可比较的
  • 本地日期(ChronoLocalDate
  • 经验值
  • 时间调整器(TemporalAccessor
  • 时间调整器

LocalDate的特点

  • 它存储月、年、日
  • 它不存储时间或时区信息
  • 它可以存储生日和假期
  • 它是不可变的类和线程安全

我们将看到LocalDate类的许多应用案例。

如何获得今天、昨天和明天的日期?

LocalDate有以下方法

LocalDate.now() LocalDate.plus() 方法用于获取默认时区的当前日期。ChronoUnit.DAYS 参数 LocalDate.minusDays()方法用于从给定的日期中减去几天。

LocalDate todayDate = LocalDate.now();  
System.out.println(todayDate);  
LocalDate tomorrowDate = todayDate.plus(1, ChronoUnit.DAYS);  
System.out.println(tomorrowDate);  
LocalDate yesterdayDate = tomorrowDate.minusDays(2);  
System.out.println(yesterdayDate);  

输出是

2018-08-27  
2018-08-28  
2018-08-26  

有两种方法来创建LocalDate对象。第一种方法,使用LocalDate.now() 方法创建LocalDate对象,返回当前日期。 第二种方法,LocalDate.of() 方法是使用yearmonthDay 创建一个LocalDate

LocalDate giveDate = LocalDate.of(2011,05,5);  
System.out.println(giveDate);  
LocalDate todayDate = LocalDate.now();  
System.out.println(todayDate);  

如何从当前日期获得年、月和周、月、年的日期?

这是一个关于LocalDate类中以下方法的例子。

  • getYear(): 返回当前年份
  • getMonthValue():返回当前年份的数字
  • getDayOfYear():返回一年中的某一天
  • getDayOfMonth():返回月的日期
  • getDayOfWeek():返回一周的日子
LocalDate todayDate = LocalDate.now();  
System.out.println("Date: "+todayDate);  
System.out.println("Year: "+todayDate.getYear());  
System.out.println("Month: "+todayDate.getMonthValue());  
System.out.println("Day of year : "+todayDate.getDayOfYear());  
System.out.println("Day of Month : "+todayDate.getDayOfMonth());  
System.out.println("Day of Week : "+todayDate.getDayOfWeek());  

输出是

Date: 2018-08-27  
Year: 2018  
Month: 8  
Day of year : 239  
Day of Month : 27  
Day of Week : MONDAY  

java.sql.Timestamp类需要有JDBC API中使用的日期和时间值。

Timestamp是日期和时间值的组合。它有toLocalDateTime() ,返回LocalDateTime ,并使用toLocalDate() 方法将其转换为LocalDate 。下面是一个例子

long time = System.currentTimeMillis();  
Timestamp timestamp=new Timestamp(time);  
System.out.println(timestamp);  
System.out.println(timestamp.toLocalDateTime().toLocalDate());  
2018-08-27 14:50:58.689  
2018-08-27  

java.time.Instant类用于表示时间线中的即时时间,它有时区信息,而localDate没有时区信息。

LocalDate localDate = LocalDate.now();  
Instant instantDate = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();  
System.out.println(instantDate);  

LocalDate有三种不同的方法来做比较。

  • isEqual方法:如果这个日期等于给定的日期,则返回true。
  • isBefore方法:如果这个日期在给定日期之前,则返回true。
  • isAfter方法:如果这个日期是一个给定的日期,则返回true。
LocalDate localDateNow = LocalDate.now();  
LocalDate localDate2016 = LocalDate.of(2016, Month.AUGUST, 10);  
LocalDate localDate2015 = LocalDate.of(2015, Month.AUGUST, 10);  
LocalDate localDate2014 = LocalDate.of(2014, Month.AUGUST, 10);  
System.out.println("now - equals - 2016 " + localDateNow.isEqual(localDate2016));  
System.out.println("2015 - After -2016 " + localDate2015.isAfter(localDate2016));  
System.out.println("2014 - After -2015 " + localDate2014.isAfter(localDate2015));  
System.out.println("2014 - Before -2015 " + localDate2014.isBefore(localDate2015));  

输出:

now - equals - 2016 false  
2015 - After -2016 false  
2014 - After -2015 false  
2014 - Before -2015 true  

LocalDate 提供parse()方法。 是用于格式化日期时间对象的类。下面的例子有一个字符串的日期,并转换为不同的格式DateTimeFormatter ISO_LOCAL_DATE和其他格式。

System.out.println(LocalDate.parse("2018-08-27",DateTimeFormatter.ISO_LOCAL_DATE));  
System.out.println(LocalDate.parse("2018/08/27",DateTimeFormatter.ofPattern("yyyy/MM/dd")));  
System.out.println(LocalDate.parse("27-08-2018",DateTimeFormatter.ofPattern("dd-MM-yyy")));  
System.out.println(LocalDate.parse("27-Aug-2018",DateTimeFormatter.ofPattern("dd-MMM-yyy")));  
System.out.println(LocalDate.parse("Aug 27, 2018",DateTimeFormatter.ofPattern("MMM dd, yyyy")));  

输出

2018-08-27  
2018-08-27  
2018-08-27  
2018-08-27  
2018-08-27  

日期无法解析,编译器在线程 "main "中抛出了Exceptionjava.time.format.DateTimeParseException。文本'28/08/2018'无法在索引0处被解析。

LocalDate 提供 format()方法,该方法接收 DateTimeFormatter 对象。 DateTimeFormatter持有字符串格式的输出日期。

System.out.println(LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE));  
System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));  
System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM-yyy")));  
System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MMM-yyy")));  
System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("MMM dd, yyyy")));  

输出:

2018-08-27  
2018/08/27  
27-08-2018  
27-Aug-2018  
Aug 27, 2018  

LocalDate 提供了_valueOf() 方法,该方法返回 java.sql.Date 对象。

LocalDate currentDate = LocalDate.now();  
Date sqlDate = Date.valueOf(currentDate);   
System.out.println(sqlDate);  

java.util.Date 是指定时间轴上的时间,包括日期和时间以及时区信息。

首先使用toInstant 转换为Instant 对象。要转换为LocalDate ,使用默认的时区ZoneId.systemDefault() ,最后调用toLocalDate() 来转换。

Date utilDate = new Date();  
System.out.println(utilDate); // Mon Aug 27 15:47:04 IST 2018  
LocalDate localDate = utilDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();  
System.out.println(localDate); //2018-08-27 

输出是

Mon Aug 27 15:47:04 IST 2018  
2018-08-27  

总结

在这篇文章中,我们了解了java.util.LocalDate这个在java8中引入的新类,也发布了使用这个类的例子。