求助:将Java Date对象转换为纯数字日期格式
解决SimpleDateFormat格式化返回对象标识而非日期字符串的问题
咱们一步步拆解你遇到的问题,轻松搞定它:
问题根源
你看到的java.text.SimpleDateFormat@7147a660其实是SimpleDateFormat对象的默认toString()输出,说明两个关键问题:
- 你可能误输出了格式化器对象本身,而不是
format()方法返回的格式化字符串; - 从Solr拿到的
tmp是Object类型,直接传给format可能存在类型不匹配的隐患(虽然DateFormat有format(Object)重载,但必须确保底层是Date实例才能正确处理)。
修复方案(旧API写法)
先把Object转成Date,再正确获取格式化后的字符串:
// 先将Solr返回的Object强制转换为Date(确认Solr的date_from字段确实返回Date类型) Date dateFromSolr = (Date) solrDoc.getFieldValue("date_from"); // 初始化日期格式化器 DateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy"); // 调用format方法得到格式化后的字符串,并用变量接收或直接输出 String formattedDate = dateFormatter.format(dateFromSolr); System.out.println(formattedDate); // 预期输出:10.03.1987
更推荐的Java 8+新日期API
SimpleDateFormat是线程不安全的,旧DateAPI设计也有不少缺陷,建议使用java.time包的类来处理,更稳定可靠:
// 转换为Date后,转成UTC时区的LocalDate(Solr日期默认是UTC时区) Date dateFromSolr = (Date) solrDoc.getFieldValue("date_from"); LocalDate localDate = dateFromSolr.toInstant().atZone(ZoneId.of("UTC")).toLocalDate(); // 使用线程安全的DateTimeFormatter格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); String formattedDate = localDate.format(formatter); System.out.println(formattedDate); // 预期输出:10.03.1987
额外提醒
- 如果Solr返回的
date_from是字符串类型,需要先把字符串解析成日期再格式化; - 多线程环境下,
SimpleDateFormat不能共享实例,而DateTimeFormatter是线程安全的,可以复用。
内容的提问来源于stack exchange,提问作者Mikachu
相关产品推荐
相关产品推荐

