From 55c80d37a1e3d1ed3ea95215abd84981044bee44 Mon Sep 17 00:00:00 2001 From: chunlin <3049478157@qq.com> Date: Wed, 16 Jul 2025 18:08:58 +0800 Subject: [PATCH] feat: replace SimpleDateFormat with DateTimeFormatter --- .../TiDBSrcVarcharDateFormatConvert.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/TiDBSrcVarcharDateFormatConvert.java b/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/TiDBSrcVarcharDateFormatConvert.java index 3cc8d1c..ad65399 100644 --- a/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/TiDBSrcVarcharDateFormatConvert.java +++ b/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/TiDBSrcVarcharDateFormatConvert.java @@ -10,7 +10,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.JDBCType; -import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -20,10 +21,8 @@ public class TiDBSrcVarcharDateFormatConvert implements CloudCanalProcessorV2 { protected static final Logger customLogger = LoggerFactory.getLogger("custom_processor"); - private static final SimpleDateFormat DTF = new SimpleDateFormat("yyyy-MM-dd"); - private final Map> tableCols = new HashMap<>(); - private final Map> formatMap = new HashMap<>(); + private final Map> formatMap = new HashMap<>(); @Override public void start(ProcessorContext processorContext) { @@ -31,11 +30,21 @@ public class TiDBSrcVarcharDateFormatConvert implements CloudCanalProcessorV2 { // The source columns we need to convert tableCols.put(test14, new HashSet<>(Arrays.asList("va", "va2"))); // Format of each source column - formatMap.put(test14, new HashMap() {{ + formatMap.put(test14, new HashMap() {{ + // 23-07-2023 + put("va", DateTimeFormatter.ofPattern("yyyy-MM-dd")); + // 23072023 + put("va2", DateTimeFormatter.ofPattern("yyyyMMdd")); + }}); + SchemaInfo test15 = new SchemaInfo(null, "test", "test15"); + // The source columns we need to convert + tableCols.put(test15, new HashSet<>(Arrays.asList("va", "va2"))); + // Format of each source column + formatMap.put(test15, new HashMap() {{ // 23-07-2023 - put("va", new SimpleDateFormat("dd-MM-yyyy")); + put("va", DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 23072023 - put("va2", new SimpleDateFormat("ddMMyyyy")); + put("va2", DateTimeFormatter.ofPattern("yyyyMMdd")); }}); } @@ -43,7 +52,7 @@ public class TiDBSrcVarcharDateFormatConvert implements CloudCanalProcessorV2 { public List process(CustomData data) { SchemaInfo schemaInfo = data.getSchemaInfo(); Set colsNeedConvert = tableCols.get(schemaInfo); - Map formats = formatMap.get(schemaInfo); + Map formats = formatMap.get(schemaInfo); if (colsNeedConvert != null && !colsNeedConvert.isEmpty() && formats != null && !formats.isEmpty()) { for (CustomRecordV2 recordV2 : data.getRecords()) { switch (data.getEventType()) { @@ -65,11 +74,11 @@ public class TiDBSrcVarcharDateFormatConvert implements CloudCanalProcessorV2 { return Collections.singletonList(data); } - protected void convertColumn(LinkedHashMap columnMap, Set colsNeedConvert, Map formats) { + protected void convertColumn(LinkedHashMap columnMap, Set colsNeedConvert, Map formats) { for (String colName : colsNeedConvert) { CustomFieldV2 col = columnMap.get(colName); Object value = col.getValue(); - SimpleDateFormat format = formats.get(colName); + DateTimeFormatter format = formats.get(colName); if (formats.get(colName) == null) { customLogger.info("Format has not been initialized yet, so ignore this column: {}", colName); continue; @@ -77,8 +86,8 @@ public class TiDBSrcVarcharDateFormatConvert implements CloudCanalProcessorV2 { if (col.getSqlType() == JDBCType.VARCHAR.getVendorTypeNumber() && value != null) { String val = value.toString(); try { - Date date = format.parse(val); - col.setValue(DTF.format(date)); + LocalDate date = LocalDate.parse(val, format); + col.setValue(date.toString()); } catch (Exception e) { customLogger.error("Failed to convert VARCHAR to DATE for value: {}", val, e); } -- Gitee