Java面试问题总结——为什么处理时间问题建议使用LocalDate类而逐渐抛弃Date类?

文章探讨了Java中Date类的局限性,如非易读的默认格式、线程不安全的SimpleDateFormat以及不便的时间操作。然后介绍了Java8引入的LocalDate类的优势,包括自定义时间、方便的日期操作、线程安全的DateTimeFormatter,以及与LocalTime和LocalDateTime的配合使用,提供更高效和安全的日期时间处理方案。

1.Date类的局限性和不安全性

Date类型如果不格式化,打印出来的日期格式可读性非常差。

Date date = new Date();//创建默认当前时间的Date类
System.out.println(date);//打印Date
// Mon Feb 17 16:19:59 CST 2020

Date类型一般采用SimpleDateFormat进行格式化,但SimpleDateFormat是线程不安全的,在高并发的情况下使用同一个SimpleDateFormat对象可能导致返回的格式化时间是错误的,为保证线程安全每个线程需要在使用时单独创建一个SimpleDateFormat对象,这样开销比较大,具体原因可以参考这篇文章SimpleDateFormat线程不安全

Date date = new Date();//创建默认当前时间的Date类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//创建日期格式化类,yyyy-MM-dd HH:mm:ss为格式化日期
String str= sdf.format(date);//获取date变量的String类型的日期格式
System.out.println(str);//打印String类型的日期
//2020-02-17 17:03:52

Date类型处理时间问题比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,Date类虽然有getYear、getMonth等方法但都已经被弃用。
在这里插入图片描述

2.使用LocalDate类的好处

创建LocalDate类,可自定义时间

//获取当前年月日
LocalDate localDate = LocalDate.now();
//构造指定的年月日
LocalDate localDate1 = LocalDate.of(2019, 9, 10);

通过LocalDate类获取年月日和星期

int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
Month month = localDate.getMonth();
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
int day = localDate.getDayOfMonth();
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);

与LocalDate类一起的还有LocalTime和LocalDateTime,都是Java8引入处理时间问题的。
LocalTime类主要用于获取时间问题,如获取时分秒等。

LocalTime localTime = LocalTime.of(13, 51, 10);
LocalTime localTime1 = LocalTime.now();
//获取小时
int hour = localTime.getHour();
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);
//获取分
int minute = localTime.getMinute();
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
//获取秒
int second = localTime.getSecond();
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);

LocalDateTime类的功能比较丰富,相当于LocalDate+LocalTime。

//创建LocalDateTime
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);

//获取LocalDate
LocalDate localDate2 = localDateTime.toLocalDate();

//获取LocalTime
LocalTime localTime2 = localDateTime.toLocalTime();

LocalDate、LocalTime和LocalDateTime类修改日期时间也比较方便,使用plus,minus,with等修改。

//创建日期时间,2019年9月10日14点46分56秒
LocalDateTime localDateTime = LocalDateTime.of(2019, 9, 10, 14, 46, 56);
//增加、减少年数、月数、天数等 以LocalDateTime为例
//增加一年
localDateTime = localDateTime.plusYears(1);
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS);
//减少一个月
localDateTime = localDateTime.minusMonths(1);
localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS); 
//通过with修改某些值
//修改年为2019
localDateTime = localDateTime.withYear(2020);
//修改年为2022
localDateTime = localDateTime.with(ChronoField.YEAR, 2022);
//修改月为10
localDateTime = localDateTime.withMonth(10);

另外如果知道这个月的第一天是几号、这一年的最后一天等,通过提供的LocalDate可以很快得到答案。

LocalDate localDate = LocalDate.now();
LocalDate firstDay = localDate.with(TemporalAdjusters.firstDayOfMonth());
LocalDate firstDayNextMonth = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
LocalDate lastDayYear = localDate.with(TemporalAdjusters.lastDayOfYear());

LocalDate的格式化方式也比较方便,可采用多种默认方式也可以自定义。相比于SimpleDateFormat,DateTimeFormatter是线程安全的。

LocalDate localDate = LocalDate.of(2019, 9, 10);
String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
//自定义格式化
DateTimeFormatter dateTimeFormatter =   DateTimeFormatter.ofPattern("dd/MM/yyyy");
String s3 = localDate.format(dateTimeFormatter);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值