有了Date为什么又引入 LocalDate、LocalTime、LocalDateTime?
Java 中的 Date 类是自 JDK 1.0 开始就存在的,但它有一些缺陷,主要有以下两个:
可变性:Date 对象是可变的,这意味着它的值可以在不知情的情况下更改,这可能导致一些奇怪的行为。
精度问题:Date 对象中包含毫秒级别的精度,但是它不能表示纳秒或微秒的时间精度,这在一些场景下是必需的。
为了解决这些问题,Java 8 引入了新的日期和时间 API,即 java.time 包。这个新的 API 引入了三个新的类来代替 Date 类:
LocalDate:表示日期,例如 2023-03-06。
LocalTime:表示时间,例如 14:30:00。
LocalDateTime:表示日期时间,例如 2023-03-06T14:30:00。
这些类都是不可变的,这意味着它们的值一旦设置就不能更改,这样可以避免上述可变性问题。此外,这些类提供了更高的时间精度,可以精确到纳秒级别。
另外,Date 类和相关的类(如 SimpleDateFormat)在多线程环境下是不安全的,而新的日期和时间 API 提供了线程安全的方式来处理日期和时间,可以更方便地在并发环境下使用。和 SimpleDateFormat 相比,DateTimeFormatter 是线程安全的。
日期获取
//获取当前年月日
LocalDate localDate = LocalDate.now();
System.out.println("当前的年月日:"+localDate);
//构造指定的年月日
LocalDate localDate1 = LocalDate.of(2019, 9, 10);
System.out.println("指定的年月日:"+localDate1);
当前的年月日:2020-01-13
指定的年月日:2019-09-10
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
System.out.println("当前年:"+year);
System.out.println("当前年:"+year1);
Month month = localDate.getMonth();
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
System.out.println("当前月:"+month);
System.out.println("当前月:"+month1);
int day = localDate.getDayOfMonth();
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
System.out.println("当前天:"+day);
System.out.println("当前天:"+day1);
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
System.out.println("当前星期:"+dayOfWeek);
System.out.println("当前星期:"+dayOfWeek1);
当前年:2020
当前年:2020
当前月:JANUARY
当前月:1
当前天:13
当前天:13
当前星期:MONDAY
当前星期:1
//创建LocalTime
LocalTime localTime = LocalTime.of(13, 51, 10);
LocalTime localTime1 = LocalTime.now();
System.out.println("当前时间:"+localTime);
System.out.println("当前时间:"+localTime1);
当前时间:13:51:10
当前时间:10:08:13.687
//获取时分秒
//获取小时
int hour = localTime.getHour();
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);
System.out.println("当前小时:"+hour);
System.out.println("当前小时:"+hour1);
//获取分
int minute = localTime.getMinute();
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
System.out.println("当前分钟:"+minute);
System.out.println("当前分钟:"+minute1);
//获取秒
int second = localTime.getMinute();
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);
System.out.println("当前秒:"+second);
System.out.println("当前秒:"+second1);
当前小时:13
当前小时:13
当前分钟:51
当前分钟:51
当前秒:51
当前秒:10
//获取年月日格式时间的几种方式
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime3 = localDate.atTime(localTime);
LocalDateTime localDateTime4 = localTime.atDate(localDate);
System.out.println("获取年月日:"+localDateTime);
System.out.println("获取年月日:"+localDateTime1);
System.out.println("获取年月日:"+localDateTime2);
System.out.println("获取年月日:"+localDateTime3);
System.out.println("获取年月日:"+localDateTime4);
获取年月日:2020-06-11T10:49:28.281
获取年月日:2019-09-10T14:46:56
获取年月日:2020-06-11T10:49:28.281
获取年月日:2020-06-11T10:49:28.281
获取年月日:2020-06-11T10:49:28.281
日期格式转换:
//格式化当前日期时间为字符串:
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
//解析日期时间字符串为 LocalDateTime 对象:
String dateTimeString = "2022-03-06 14:30:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
//格式化和解析日期对象:
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(formattedDate, formatter);
Date和Local转换
//1、 Date 转 LocalDate、 toLocalDateTime
public LocalDate dateToLocal(Date date) {
return date.toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
//.toLocalDateTime:
}
//2、 LocalDate 转 Date
public java.util.Date localeDateToDate(LocalDate localdate) {
return java.util.Date.from(localdate.atStartOfDay()
.atZone(ZoneId.systemDefault()).toInstant());
}
// 3、 LocalDateTime 转 Date
public java.util.Date localeDateTimeToDate(LocalDateTime localDateTime) {
return java.util.Date.from(localDateTime
.atZone(ZoneId.systemDefault()).toInstant());
}