浏览代码

支持MySQL数据类型varchar同步MySQL时间datetime

AE86 2 年之前
父节点
当前提交
9c3ddfc555

+ 12 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/util/DateFormatUtil.java

@@ -2,6 +2,9 @@ package org.dbsyncer.common.util;
 
 import java.sql.Date;
 import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.*;
 import java.time.temporal.ChronoField;
@@ -13,6 +16,10 @@ public abstract class DateFormatUtil {
      * yyyy-MM-dd HH:mm:ss
      */
     public static final DateTimeFormatter CHINESE_STANDARD_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    /**
+     * yyyy-MM-dd'T'HH:mm:ss.SSSz
+     */
+    public static final DateFormat GMT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz");
     /**
      * yyyy-MM-dd
      */
@@ -87,6 +94,11 @@ public abstract class DateFormatUtil {
     public static Timestamp stringToTimestamp(String s) {
         return Timestamp.valueOf(LocalDateTime.from(CHINESE_STANDARD_TIME_FORMATTER.parse(s)));
     }
+
+    public static Timestamp stringToTimestamp(String s, DateFormat formatter) throws ParseException {
+        return new Timestamp(formatter.parse(s).getTime());
+    }
+
     public static OffsetTime timeWithTimeZone(String s) {
         return OffsetTime.parse(s, TIME_TZ_FORMAT).withOffsetSameInstant(ZoneOffset.UTC);
     }

+ 20 - 8
dbsyncer-parser/src/main/java/org/dbsyncer/parser/convert/handler/StringToTimestampHandler.java

@@ -4,6 +4,8 @@ import org.dbsyncer.common.column.Lexer;
 import org.dbsyncer.common.util.DateFormatUtil;
 import org.dbsyncer.parser.convert.AbstractHandler;
 
+import java.text.ParseException;
+
 /**
  * 字符串转Timestamp
  *
@@ -14,19 +16,29 @@ import org.dbsyncer.parser.convert.AbstractHandler;
 public class StringToTimestampHandler extends AbstractHandler {
 
     @Override
-    public Object convert(String args, Object value) {
+    public Object convert(String args, Object value) throws ParseException {
         if (value instanceof String) {
             String s = (String) value;
             // 2020-7-12 00:00:00
-            if(s.length() < 19){
-                s = format(s);
+            if (s.length() < 19) {
+                return DateFormatUtil.stringToTimestamp(format(s));
+            }
+
+            // 2022-07-21T05:35:34.000+0800
+            if (s.length() == 28) {
+                return DateFormatUtil.stringToTimestamp(s, DateFormatUtil.GMT_FORMATTER);
+            }
+
+            // 2022-07-21T05:35:34.000+08:00
+            if (s.length() == 29) {
+                s = s.replaceAll(":[^:]*$", "00");
+                return DateFormatUtil.stringToTimestamp(s, DateFormatUtil.GMT_FORMATTER);
             }
-            value = DateFormatUtil.stringToTimestamp(s);
         }
         return value;
     }
 
-    private String format(String s){
+    private String format(String s) {
         StringBuilder buf = new StringBuilder();
         Lexer lexer = new Lexer(s);
         char comma = '-';
@@ -53,13 +65,13 @@ public class StringToTimestampHandler extends AbstractHandler {
 
     private void nextToken(Lexer lexer, StringBuilder buf, char comma, boolean appendComma) {
         buf.append(fillZero(lexer.nextToken(comma)));
-        if(appendComma){
+        if (appendComma) {
             buf.append(comma);
         }
     }
 
-    private String fillZero(String s){
-        if(s.length() < 2){
+    private String fillZero(String s) {
+        if (s.length() < 2) {
             return String.format("%02d", Integer.parseInt(s));
         }
         return s;