1.情景展示
在实际开发过程中,可能会遇到将前端传的日期格式转成LocalDateTime插入到数据库的情况,如何将日期转成LocalDateTime呢?
2.原因分析
在Java8中,日期类不同于以前版本的java.util.Date工具类,Date类可以存日期也可以存时间,还能存日期+时间,统统都能塞进去;
但java8中将日期与时间拆分开来,日期类使用LocalDate,时间类使用LocalTime,日期+时间,使用LocalDateTime;
如果我们见日期塞进LocalDateTime就会报错:
DateUtil.toLocalDateTime("2021年07月28日", "yyyy年MM月dd日");
这个错误的意思就是:日期格式无法转成日期+时间格式。
3.解决方案
既然,LocalDateTime需要时间,而我们又只有日期的情况下,那就只能自己伪造时间啦。
方式一:手动拼接时间00:00:00
/* * 字符串拼接转日期 * @date: 2020年08月20日 0020 15:51 * @param: date * @param: format * @return: java.time.LocalDateTime */ public static LocalDateTime toLocalDateTime(String dateTime, String format) { if (StringUtils.isEmpty(dateTime)) { return null; } if (StringUtils.isEmpty(format)) { format = "yyyy-MM-dd HH:mm:ss"; } DateTimeFormatter df = DateTimeFormatter.ofPattern(format); LocalDateTime ldt = LocalDateTime.parse(dateTime,df); return ldt; }
调用
String dateStr = "2021年07月28日"; dateStr += " 00:00:00"; LocalDateTime dateTime = DateUtil.toLocalDateTime(dateStr, "yyyy年MM月dd日 HH:mm:ss"); System.out.println(dateTime);
执行结果:
2021-07-28T00:00
方式二:DateTimeFormatter设置可选匹配项默认值
/* * 日期字符串按指定格式转LocalDateTime * @attention: * @date: 2021/7/28 15:05 * @param: dateStr * @param: format * @return: java.time.LocalDateTime */ @NotNull public static LocalDateTime toLocalDateTime(String dateStr, @NotNull String format) { DateTimeFormatter formatter; if (StringUtils.isEmpty(format)) { format = "yyyy-MM-dd"; } if (format.length() > 11) {// 包含时间 formatter = DateTimeFormatter.ofPattern(format); } else {// 只有日期 formatter = new DateTimeFormatterBuilder() .appendPattern(format + "[['T'HH][:mm][:ss]]") .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) .parseDefaulting(ChronoField.MILLI_OF_SECOND, 0) .toFormatter(); } return LocalDateTime.parse(dateStr, formatter); }
调用
System.out.println(DateUtils.toLocalDateTime("2021年07月28日", "yyyy年MM月dd日"));
执行结果:
2021-07-28T00:00