本文介绍如何使用 java 的 simpledateformat 类将形如 "2023-03-13 12:00:02" 的日期字符串转换为 "13-03-2023 12:00:02.000000000" 格式,涵盖解析、格式化关键步骤及常见陷阱。
本文介绍如何使用 java 的 simpledateformat 类将形如 "2023-03-13 12:00:02" 的日期字符串转换为 "13-03-2023 12:00:02.000000000" 格式,涵盖解析、格式化关键步骤及常见陷阱。
要实现从 "yyyy-MM-dd HH:mm:ss" 到 "dd-MM-yyyy HH:mm:ss.SSSSSSSSS" 的字符串格式转换,核心在于两步操作:先正确解析原始字符串为 Date 对象,再按目标模式重新格式化。注意:Java 原生 SimpleDateFormat 不支持纳秒(9位小数秒)输出——它最多精确到毫秒(SSS),因此需额外处理纳秒部分。
以下是推荐的实现方式(兼容 Java 8+,兼顾可读性与健壮性):
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatExample {
// ✅ 推荐:使用 SimpleDateFormat(适用于 Java <p>⚠️ <strong>重要注意事项</strong>:</p>
- 原始代码中 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 模式与输入 "2023-03-13 12:00:02" 不匹配(多了 'T' 和 'Z'),会导致 ParseException;
- hh 表示 12 小时制(01–12),应使用 HH 表示 24 小时制(00–23),避免时间错乱;
- Ka 是无效模式字母,属误写;SSSSSSSSS 在 SimpleDateFormat 中会被截断为 SSS(毫秒),无法输出纳秒——若业务严格要求纳秒精度(如数据库 TIMESTAMP(9)),必须改用 java.time API:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
// ✅ 更现代、线程安全、支持纳秒的方案(Java 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";
}
✅ 总结:
- 优先选用 java.time(LocalDateTime + DateTimeFormatter)替代已过时且非线程安全的 SimpleDateFormat;
- 确保解析模式与输入字符串完全一致(空格、分隔符、大小写均敏感);
- 纳秒级格式需明确数据来源——若原始字符串不含纳秒,则补零是安全做法;若需动态纳秒,应从 Instant 或 LocalDateTime.now() 获取完整时间戳后再格式化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











