用LocalDateTime、LocalDate、LocalTime代替Date
一. LocalDate
LocalDate
类只会获取到年、月、日。
@Test
public void testLocalDate() {
// 获取当前年月日
LocalDate localDate = LocalDate.now();
// 构造指定的年月日
LocalDate.of(2021, 9, 1);
// toString() 打印字符串类型的日期,默认yyyy-MM-dd
System.out.println(localDate.toString());
// 获取年份的两种方式
int year = localDate.getYear();
int y1 = localDate.get(ChronoField.YEAR);
System.out.println("当前年份:" + year);
// 获取月份的两种方式
int month = localDate.getMonth().getValue();
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
System.out.println("当前月份:" + month1);
// 获取日期天的两种方式
int day = localDate.getDayOfMonth();
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
System.out.println("当前月份:" + day);
int dayOfWeek = localDate.getDayOfWeek().getValue();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
System.out.println("当前星期" + dayOfWeek1);
// 本月第一天日期
LocalDate first = localDate.with(TemporalAdjusters.firstDayOfMonth());
// 本月最后一天日期
LocalDate end = localDate.with(TemporalAdjusters.lastDayOfMonth());
// 获取前一天的日期、年、月
LocalDate data = localDate.plusDays(-1);
LocalDate d = localDate.plusMonths(-1);
LocalDate dd = localDate.plusYears(-1);
// 获取后一天的日期
LocalDate data2 = localDate.plusDays(1);
// 获取当前日其所在月总天数
LocalDate startTime = LocalDate.parse("2021-06-01");
LocalDate endTime = LocalDate.parse("2021-05-01");
long betweenDays = ChronoUnit.DAYS.between(startTime, endTime);
System.out.println(betweenDays);
}
结果(只打印个别):
二. LocalTime
LocalTime
只会获取到时、分、秒。
@Test
public void testLocalTime() {
// 获取当前的时、分、秒
LocalTime now = LocalTime.now();
LocalTime.of(12,10,30);
System.out.println(now.toString());
// 获取小时
int hour = now.getHour();
int hour1 = now.get(ChronoField.HOUR_OF_DAY);
System.out.println(hour);
// 获取分
int minute = now.getMinute();
int minute1 = now.get(ChronoField.MINUTE_OF_HOUR);
System.out.println(minute);
// 获取秒
int second = now.getSecond();
int second1 = now.get(ChronoField.SECOND_OF_MINUTE);
System.out.println(second);
// 纳秒
int nano = now.getNano();
System.out.println(nano);
}
结果:
三. LocalDateTime
LocalDateTime
可以获得年、月、日、时、分、秒。来个公式:LocalDateTime = LocalDate + LocalTime
。
@Test
public void testLocalDateTime() {
LocalDateTime localDateTime = LocalDateTime.of(2021, Month.SEPTEMBER, 10,
14, 20, 10);
System.out.println(localDateTime.toString());
// 修改年为2019
localDateTime = localDateTime.withYear(2020);
System.out.println(localDateTime.toString());
// 修改为2022
localDateTime = localDateTime.with(ChronoField.MONTH_OF_YEAR, 3);
System.out.println(localDateTime.toString());
}
结果:
四. 自定义格式化
格式:xxx.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
三者都可以自定义格式化,以LocalDateTime
为例:
@Test
public void testLocalDateTime() {
LLocalDateTime localDateTime = LocalDateTime.of(2021, Month.SEPTEMBER, 10,
14, 20, 10);
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println(localDateTime.format(DateTimeFormatter.BASIC_ISO_DATE));
System.out.println(localDateTime.format(DateTimeFormatter.ISO_DATE));
System.out.println(localDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
System.out.println(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE));
System.out.println(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
结果如下:
DateTimeFormatter
和SimpleDateFormat
对比而言,DateTimeFormatter
是线性安全的。
最后做个总结,对于Jdk8的应用,可以做出以下改变:
Instant
代替Date
。LocalDateTime
代替Calendar
DateTimeFormatter
代替SimpleDateFormat
。