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

如何在Java中将不同格式的时间戳字符串统一转换为指定格式?

解决Java中多格式时间戳转换为统一格式的问题

你的问题出在使用的DateTimeFormatter仅匹配了yyyy-MM-dd'T'HH:mm:ss基础格式,但实际的两个时间戳包含小数秒和时区标识(+05:30或Z),解析时格式不匹配导致抛出ParseException。

推荐使用Java 8及以上版本自带的java.time包(JSR-310标准)来处理,这是替代老旧SimpleDateFormat的安全方案,支持标准ISO 8601时间格式的各种变体。

方法一:利用预定义解析能力直接处理

你的两个时间戳都是标准ISO 8601格式的变体,OffsetDateTime类可以直接解析它们,不需要自定义复杂的格式化规则:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class TimestampConverter {
    public static void main(String[] args) {
        String timestamp1 = "2022-08-17T18:28:07.288496+05:30";
        String timestamp2 = "2022-10-27T13:17:47.987736542Z";
        
        // 定义目标输出格式
        DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        
        // 解析并格式化第一个时间戳
        OffsetDateTime odt1 = OffsetDateTime.parse(timestamp1);
        String formatted1 = odt1.format(targetFormatter);
        System.out.println(formatted1); // 输出:2022-08-17T18:28:07
        
        // 解析并格式化第二个时间戳
        OffsetDateTime odt2 = OffsetDateTime.parse(timestamp2);
        String formatted2 = odt2.format(targetFormatter);
        System.out.println(formatted2); // 输出:2022-10-27T13:17:47
    }
}

原理说明

OffsetDateTime默认支持解析所有符合ISO 8601标准的时间字符串,包括带任意长度小数秒、时区偏移(如+05:30)和UTC标识(Z)的格式,无需手动编写匹配规则。

方法二:自定义多格式匹配器(更灵活)

如果需要兼容更多非标准的时间格式,可以使用DateTimeFormatterBuilder构建一个支持多种格式的解析器:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class MultiFormatTimestampConverter {
    public static void main(String[] args) {
        String timestamp1 = "2022-08-17T18:28:07.288496+05:30";
        String timestamp2 = "2022-10-27T13:17:47.987736542Z";
        
        // 构建支持多格式的解析器
        DateTimeFormatter multiParser = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                .optionalStart() // 小数秒部分为可选
                .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true) // 支持1-9位小数秒
                .optionalEnd()
                .optionalStart() // 时区部分为可选,支持+/-HH:mm或Z
                .appendOffset("+HH:mm", "Z")
                .optionalEnd()
                .toFormatter(Locale.ENGLISH);
        
        DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        
        // 解析并格式化
        String formatted1 = OffsetDateTime.parse(timestamp1, multiParser).format(targetFormatter);
        String formatted2 = OffsetDateTime.parse(timestamp2, multiParser).format(targetFormatter);
        
        System.out.println(formatted1);
        System.out.println(formatted2);
    }
}

注意事项

  • 避免使用SimpleDateFormat:它是线程不安全的,且不支持现代时间API的特性,在Java 8+环境下建议完全替换为java.time包下的类。
  • 小数秒会被自动截断:格式化到yyyy-MM-dd'T'HH:mm:ss时,小数秒部分会被丢弃,如果你需要保留可以调整目标格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:15:51