Java日期字符串格式化为指定样式

作者:技术拾光

时间:2026-07-02

浏览:508

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"这种包含纳秒的格式。

Java日期字符串格式化为指定样式

核心思路分为两步:先将原始字符串解析为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.time API。

下面给出基于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()获取完整时间戳后再格式化。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›