import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; /** * 解析带时区的时间字符串并格式化 */ public class TimeFormatConverter { // 目标格式化样式可根据需求修改 public static final String TARGET_PATTERN yyyy-MM-dd HH:mm:ss; // 目标时区默认转成东八区/北京时间可根据需求修改 public static final ZoneId TARGET_ZONE ZoneId.of(Asia/Shanghai); /** * 核心方法解析ISO格式时间字符串 → 转换时区 → 格式化 * param timeStr 原始时间字符串如2026-03-10T01:55:59.1690000 * param targetPattern 目标格式如yyyy-MM-dd HH:mm:ss * param targetZone 目标时区如Asia/Shanghai * return 格式化后的时间字符串 */ public static String convertIsoTime(String timeStr, String targetPattern, ZoneId targetZone) { if (timeStr null || timeStr.isEmpty()) { return ; } try { // 步骤1解析原始ISO时间字符串兼容0000/UTC时区格式 // 先处理格式将0000替换为00:00符合OffsetDateTime解析要求 String standardIsoStr timeStr.replaceFirst((\\\\d{2})(\\d{2})$, $1:$2); OffsetDateTime offsetDateTime OffsetDateTime.parse(standardIsoStr); // 步骤2转换为目标时区比如从UTC0转成UTC8 ZonedDateTime targetZonedTime offsetDateTime.atZoneSameInstant(targetZone); // 步骤3格式化为目标字符串 DateTimeFormatter formatter DateTimeFormatter.ofPattern(targetPattern); return targetZonedTime.format(formatter); } catch (DateTimeParseException e) { throw new IllegalArgumentException(时间字符串解析失败原始字符串 timeStr, e); } } // 简化方法使用默认目标格式和时区东八区 yyyy-MM-dd HH:mm:ss public static String convertIsoTime(String timeStr) { return convertIsoTime(timeStr, TARGET_PATTERN, TARGET_ZONE); } // 测试示例 public static void main(String[] args) { // 原始时间字符串UTC0时区 String originalTimeStr 2026-03-10T01:55:59.1690000; // 转换为东八区的 yyyy-MM-dd HH:mm:ss 格式 String formattedTime convertIsoTime(originalTimeStr); System.out.println(原始时间UTC0 originalTimeStr); System.out.println(格式化后UTC8 formattedTime); // 输出2026-03-10 09:55:59 // 自定义格式示例只保留年月日 String customFormat convertIsoTime(originalTimeStr, yyyy-MM-dd, TARGET_ZONE); System.out.println(自定义格式年月日 customFormat); // 输出2026-03-10 } }