如何在 Java 中将日期字符串格式化为指定样式
Ja va中日期字符串格式转换:从"yyyy-MM-dd"到"dd-MM-yyyy"且带有纳秒 处理日期格式转换,是Ja va日常开发中再常见不过的场景了。但看似简单的事情,如果细节没处理好,坑也不少。这篇文章就来聊聊如何把一个形如 "2023-03-13 12:00:02" 的字符串,转换成 "1
Ja va中日期字符串格式转换:从"yyyy-MM-dd"到"dd-MM-yyyy"且带有纳秒
处理日期格式转换,是Ja va日常开发中再常见不过的场景了。但看似简单的事情,如果细节没处理好,坑也不少。这篇文章就来聊聊如何把一个形如 "2023-03-13 12:00:02" 的字符串,转换成 "13-03-2023 12:00:02.000000000" 这种带纳秒的格式。

核心思路其实就两步:先把原始字符串解析成Date对象,再按目标格式重新格式化一遍。不过,Ja va原生的SimpleDateFormat有一个硬伤——它最多只能处理到毫秒(SSS),对纳秒(9位小数秒)无能为力。所以,如果目标格式要求带9个0,就得额外想办法。
下面给出一个比较健壮、可读性也还不错的实现方案(兼容Ja va 8及以下版本):
import ja va.text.ParseException;
import ja va.text.SimpleDateFormat;
import ja va.util.Date;
public class DateFormatExample {
// ✅ 推荐:使用 SimpleDateFormat(适用于 Ja va < 8 或需兼容旧环境)
static String formatoFechaFinBd(String dateService) throws ParseException {
// 1. 解析输入字符串:注意原始格式不含 'T' 和 'Z',不应使用 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateService);
// 2. 格式化为 dd-MM-yyyy HH:mm:ss + 补零的9位纳秒(因 SimpleDateFormat 不支持纳秒,此处默认补 "000000000")
String baseFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(date);
return baseFormat + ".000000000"; // 纳秒部分固定补零(若需真实纳秒,请用 ja va.time)
}
}
几个容易踩的坑,必须重点提一下:
- 很多人习惯性地把模式写成 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",但原始输入字符串 "2023-03-13 12:00:02" 里根本没有 'T' 和 'Z',这样解析一定会抛出
ParseException。 - 注意区分 hh 和 HH。hh 表示12小时制(01–12),而 HH 才是24小时制(00–23)。用错了,时间就会乱套。
- Ka 是无效的模式字母,属于误写。而 SSSSSSSSS 在 SimpleDateFormat 中会被截断成 SSS,只保留前三位,根本没法输出纳秒。如果业务真的要求纳秒精度(比如数据库字段是 TIMESTAMP(9)),那就必须换用
ja va.timeAPI。
既然提到了ja va.time,那就给出它的实现方式,更现代、线程安全,而且天然支持纳秒:
import ja va.time.LocalDateTime;
import ja va.time.format.DateTimeFormatter;
// ✅ 更现代、线程安全、支持纳秒的方案(Ja va 8+)
static String formatoFechaFinBdModern(String dateService) {
LocalDateTime dt = LocalDateTime.parse(dateService, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 注意:LocalDateTime.parse() 无法直接解析纳秒,原始字符串无纳秒信息,故补零是合理默认行为
return dt.format(DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")) + ".000000000";
}
结论很明确:
- 从兼容性和长期维护角度看,更推荐的做法是:优先选用
ja va.time(LocalDateTime+DateTimeFormatter),替代已过时且非线程安全的SimpleDateFormat。 - 解析模式必须与输入字符串完全一致,包括空格、分隔符,大小写也敏感,差一点都不行。
- 纳秒级格式的处理,关键要看数据来源。如果原始字符串本身不含纳秒信息,那补零就是最安全、最合理的做法。如果业务需要动态纳秒,那就得从
Instant或LocalDateTime.now()获取完整时间戳后再格式化。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















