Java日期字符串格式化为指定样式
作者:技术拾光时间:2026-07-02 08:13:06浏览:507
Java中日期字符串格式转换:从"yyyy-MM-dd"到"dd-MM-yyyy"且带纳秒 在Java日常开发中,日期格式转换是一项常见任务。然而,看似简单的操作若忽略细节,容易引发预料之外的错误。本文讨论如何将形如"2023-03-13 12:00:02"的字符串,转换为"13-03-2023 1
Java中日期字符串格式转换:从"yyyy-MM-dd"到"dd-MM-yyyy"且带纳秒
在Java日常开发中,日期格式转换是一项常见任务。然而,看似简单的操作若忽略细节,容易引发预料之外的错误。本文讨论如何将形如"2023-03-13 12:00:02"的字符串,转换为"13-03-2023 12:00:02.000000000"这种包含纳秒的格式。

核心思路分为两步:先将原始字符串解析为Date对象,再按目标格式重新格式化。但Java原生的SimpleDateFormat存在一个限制:它最高只能处理毫秒(SSS),无法直接处理纳秒(9位小数秒)。因此,当目标格式要求显示9个零时,需要额外处理。
下面提供一个健壮、可读性良好的实现方案(兼容Java 8及以下版本):
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatExample {
// 推荐:使用 SimpleDateFormat(适用于 Java < 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"; // 纳秒部分固定补零(若需真实纳秒,请用 java.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)),必须改用
java.timeAPI。
下面给出基于java.time的实现,它更现代、线程安全,且原生支持纳秒:
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()获取完整时间戳后再格式化。
