java.util.Date(Date从现在开始)是一个糟糕的类型,这解释了为什么它的大部分内容在 Java 1.1 中被弃用(但不幸的是仍在使用)。
设计缺陷包括:
关键原因如下:
图片
解决思路:避免使用java.util.Date与java.sql.Date类和其提供的API,考虑使用java.time.Instant类或java.time.LocalDateTime类及其提供的API替代。
只能说这种基础的类改起来牵一发动全身,需要从DO实体类看起,然后就是各种Converter,最后是DTO。
由于我们还是微服务架构,业务服务依赖于基础服务的API,所以必须要一起改否则就会报错。这里就不细说修改流程了,主要说一下我们在改造的时候遇到的一些问题。
首先你需要确定数据对象中的 Date 字段代表的是日期、时间还是时间戳。
更新数据对象类中的字段,把 Date 类型改为适当的 java.time 类型。
原来的方式:
Date nowDate = new Date();Date nowCalendarDate = Calendar.getInstance().getTime();
使用 java.time 改造后:
// 使用Instant代表一个时间点,这与Date类似Instant nowInstant = Instant.now();// 如果需要用到具体的日期和时间(例如年、月、日、时、分、秒)LocalDateTime nowLocalDateTime = LocalDateTime.now();// 如果你需要和特定的时区交互,可以使用ZonedDateTimeZonedDateTime nowZonedDateTime = ZonedDateTime.now();// 如果你需要转换回java.util.Date,你可以这样做(假设你的代码其他部分还需要使用Date)Date nowFromDateInstant = Date.from(nowInstant);// 如果需要与java.sql.Timestamp交互java.sql.Timestamp nowFromInstant = java.sql.Timestamp.from(nowInstant);
一些注意点:
a. dateFormat
原来的方式
public static String dateFormat(Date date, String dateFormat) { SimpleDateFormat formatter = new SimpleDateFormat(dateFormat); return formatter.format(date);}
使用java.time改造后
public static String dateFormat(LocalDateTime date, String dateFormat) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat); return date.format(formatter);}
b. addSecond、addMinute、addHour、addDay、addMonth、addYear
原来的方式
public static Date addSecond(Date date, int second) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(13, second); return calendar.getTime();}public static Date addMinute(Date date, int minute) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(12, minute); return calendar.getTime();}public static Date addHour(Date date, int hour) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(10, hour); return calendar.getTime();}public static Date addDay(Date date, int day) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(5, day); return calendar.getTime();}public static Date addMonth(Date date, int month) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(2, month); return calendar.getTime();}public static Date addYear(Date date, int year) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(1, year); return calendar.getTime();}
使用java.time改造后
public static LocalDateTime addSecond(LocalDateTime date, int second) { return date.plusSeconds(second);}public static LocalDateTime addMinute(LocalDateTime date, int minute) { return date.plusMinutes(minute);}public static LocalDateTime addHour(LocalDateTime date, int hour) { return date.plusHours(hour);}public static LocalDateTime addDay(LocalDateTime date, int day) { return date.plusDays(day);}public static LocalDateTime addMonth(LocalDateTime date, int month) { return date.plusMonths(month);}public static LocalDateTime addYear(LocalDateTime date, int year) { return date.plusYears(year);}
c. dateToWeek
原来的方式
public static final String[] WEEK_DAY_OF_CHINESE = new String[]{"周日", "周一", "周二", "周三", "周四", "周五", "周六"};public static String dateToWeek(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); return WEEK_DAY_OF_CHINESE[cal.get(7) - 1];}
使用java.time改造后
public static final String[] WEEK_DAY_OF_CHINESE = new String[]{"周日", "周一", "周二", "周三", "周四", "周五", "周六"};public static String dateToWeek(LocalDate date) { DayOfWeek dayOfWeek = date.getDayOfWeek(); return WEEK_DAY_OF_CHINESE[dayOfWeek.getValue() % 7];}
d. getStartOfDay和getEndOfDay
原来的方式
public static Date getStartTimeOfDay(Date date) { if (date == null) { return null; } else { LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault()); LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN); return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); }}public static Date getEndTimeOfDay(Date date) { if (date == null) { return null; } else { LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault()); LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX); return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); }}
使用java.time改造后
public static LocalDateTime getStartTimeOfDay(LocalDateTime date) { if (date == null) { return null; } else { // 获取一天的开始时间,即00:00 return date.toLocalDate().atStartOfDay(); }}public static LocalDateTime getEndTimeOfDay(LocalDateTime date) { if (date == null) { return null; } else { // 获取一天的结束时间,即23:59:59.999999999 return date.toLocalDate().atTime(LocalTime.MAX); }}
e. betweenStartAndEnd
原来的方式
public static Boolean betweenStartAndEnd(Date nowTime, Date beginTime, Date endTime) { Calendar date = Calendar.getInstance(); date.setTime(nowTime); Calendar begin = Calendar.getInstance(); begin.setTime(beginTime); Calendar end = Calendar.getInstance(); end.setTime(endTime); return date.after(begin) && date.before(end);}
使用java.time改造后
public static Boolean betweenStartAndEnd(Instant nowTime, Instant beginTime, Instant endTime) { return nowTime.isAfter(beginTime) && nowTime.isBefore(endTime);}
我这里就只列了一些,如果有缺失的可以自己补充,不会写的话直接问问ChatGPT,它最会干这事了。最后把这些修改后的方法替换一下就行了。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-81878-0.html为何应抛弃Date:探索更优的日期处理方案
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 从JDK8到JDK14:阿里巴巴面试题探索Java的演进之路!
下一篇: 从MVC到DDD:探寻软件架构的本质变迁