You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL格式'YYYY-MM-DD HH24:MI:SS.FF'转Java的日期格式化问题

Java实现与Oracle TO_CHAR等价的日期格式化

我来帮你解决这个问题,你的Java代码报错主要是因为SimpleDateFormat的格式符使用错误,而且它本身不支持微秒级的解析,咱们一步步来处理:

先分析你的问题根源

  1. 你用的SimpleDateFormat格式字符串"yyyy-MMM-dd HH24:mm:ss.ff"有多处错误:
    • MMM是月份缩写(比如Jan、Feb),但你的原始日期是数字月份,应该用MM
    • HH24不是Java的格式符,24小时制的小时应该用HH
    • ff在Java里代表毫秒(最多三位),但你的原始数据是微秒(六位),SimpleDateFormat不支持微秒解析
  2. 原始日期字符串2018-4-24.8.1. 30. 404577000的格式是年-月-日.时.分. 秒. 微秒000,和你写的格式完全不匹配,这也是解析报错的核心原因

推荐解决方案(Java 8+ 优先使用)

Java 8引入的DateTimeFormatter是线程安全的,而且支持微秒级的时间处理,完全能匹配Oracle的TO_CHAR(crtd_ts,'YYYY-MM-DD HH24:MI:SS.FF')效果,代码如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

private String formatDate(String refCrtdTs) {
    // 定义解析原始字符串的格式,匹配"2018-4-24.8.1. 30. 404577000"的结构
    DateTimeFormatter parser = new DateTimeFormatterBuilder()
            .appendPattern("yyyy-M-dd.H.m. ss. ")
            // 解析6位微秒
            .appendValue(java.time.temporal.ChronoField.MICRO_OF_SECOND, 6)
            // 忽略末尾的3个0(纳秒部分)
            .appendLiteral("000")
            .toFormatter(Locale.ENGLISH);
    
    // 把原始字符串解析为LocalDateTime
    LocalDateTime dateTime = LocalDateTime.parse(refCrtdTs, parser);
    
    // 定义目标格式,对应Oracle的YYYY-MM-DD HH24:MI:SS.FF
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
    
    return formatter.format(dateTime);
}

代码说明

  • 用DateTimeFormatterBuilder灵活构建解析格式,完美匹配原始字符串的特殊分隔符
  • MICRO_OF_SECOND专门处理6位微秒,对应Oracle的FF格式
  • 目标格式里的HH对应Oracle的HH24,mm对应MI,SSSSSS对应FF

旧版本Java兼容方案(Java 7及以下)

如果你的项目还在使用Java 7或更早版本,只能通过手动拆分字符串来处理微秒,因为SimpleDateFormat不支持微秒解析:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

private String formatDate(String refCrtdTs) {
    // 拆分原始字符串,分离日期时间和微秒部分
    String[] mainParts = refCrtdTs.split("\\. ");
    if (mainParts.length != 2) {
        // 处理格式异常的情况
        return null;
    }
    // 把日期部分的点替换成空格,变成"2018-4-24 8 1"
    String dateTimeStr = mainParts[0].replace('.', ' ');
    // 拆分时间和微秒部分
    String[] timeMicroParts = mainParts[1].split("\\.");
    if (timeMicroParts.length != 2) {
        return null;
    }
    String secondStr = timeMicroParts[0];
    // 截取前6位作为微秒
    String microStr = timeMicroParts[1].substring(0, 6);

    // 解析日期时间到秒级
    SimpleDateFormat parser = new SimpleDateFormat("yyyy-M-dd H m s");
    Date date = null;
    try {
        date = parser.parse(dateTimeStr + " " + secondStr);
    } catch (ParseException e) {
        e.printStackTrace();
        return null;
    }

    // 格式化到秒,再拼接微秒
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return formatter.format(date) + "." + microStr;
}

内容的提问来源于stack exchange,提问作者Aadil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:14