有了Date为什么又引入 LocalDate、LocalTime、LocalDateTime

有了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());
}

小坑:

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值