|
@@ -2,19 +2,26 @@ package com.alibaba.otter.canal.client.adapter.support;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.net.URL;
|
|
|
-import java.sql.Connection;
|
|
|
-import java.sql.ResultSet;
|
|
|
-import java.sql.SQLException;
|
|
|
-import java.sql.Statement;
|
|
|
+import java.sql.*;
|
|
|
+import java.time.*;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.TimeZone;
|
|
|
import java.util.function.Consumer;
|
|
|
import java.util.function.Function;
|
|
|
|
|
|
import javax.sql.DataSource;
|
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
+import org.joda.time.DateTime;
|
|
|
+import org.joda.time.DateTimeZone;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import com.google.common.cache.CacheBuilder;
|
|
|
+import com.google.common.cache.CacheLoader;
|
|
|
+import com.google.common.cache.LoadingCache;
|
|
|
+
|
|
|
public class Util {
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(Util.class);
|
|
@@ -136,4 +143,132 @@ public class Util {
|
|
|
|
|
|
return column;
|
|
|
}
|
|
|
+
|
|
|
+ private static String timeZone; // 当前时区
|
|
|
+ private static DateTimeZone dateTimeZone;
|
|
|
+
|
|
|
+ static {
|
|
|
+ TimeZone localTimeZone = TimeZone.getDefault();
|
|
|
+ int rawOffset = localTimeZone.getRawOffset();
|
|
|
+ String symbol = "+";
|
|
|
+ if (rawOffset < 0) {
|
|
|
+ symbol = "-";
|
|
|
+ }
|
|
|
+ rawOffset = Math.abs(rawOffset);
|
|
|
+ int offsetHour = rawOffset / 3600000;
|
|
|
+ int offsetMinute = rawOffset % 3600000 / 60000;
|
|
|
+ String hour = String.format("%1$02d", offsetHour);
|
|
|
+ String minute = String.format("%1$02d", offsetMinute);
|
|
|
+ timeZone = symbol + hour + ":" + minute;
|
|
|
+ dateTimeZone = DateTimeZone.forID(timeZone);
|
|
|
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT" + timeZone));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通用日期时间字符解析
|
|
|
+ *
|
|
|
+ * @param datetimeStr 日期时间字符串
|
|
|
+ * @return Date
|
|
|
+ */
|
|
|
+ public static Date parseDate(String datetimeStr) {
|
|
|
+ if (StringUtils.isEmpty(datetimeStr)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ datetimeStr = datetimeStr.trim();
|
|
|
+ if (datetimeStr.contains("-")) {
|
|
|
+ if (datetimeStr.contains(":")) {
|
|
|
+ datetimeStr = datetimeStr.replace(" ", "T");
|
|
|
+ }
|
|
|
+ } else if (datetimeStr.contains(":")) {
|
|
|
+ datetimeStr = "T" + datetimeStr;
|
|
|
+ }
|
|
|
+
|
|
|
+ DateTime dateTime = new DateTime(datetimeStr, dateTimeZone);
|
|
|
+
|
|
|
+ return dateTime.toDate();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static LoadingCache<String, DateTimeFormatter> dateFormatterCache = CacheBuilder.newBuilder()
|
|
|
+ .build(new CacheLoader<String, DateTimeFormatter>() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DateTimeFormatter load(String key) {
|
|
|
+ return DateTimeFormatter.ofPattern(key);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ public static Date parseDate2(String datetimeStr) {
|
|
|
+ if (StringUtils.isEmpty(datetimeStr)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ datetimeStr = datetimeStr.trim();
|
|
|
+ int len = datetimeStr.length();
|
|
|
+ if (datetimeStr.contains("-") && datetimeStr.contains(":") && datetimeStr.contains(".")) {
|
|
|
+ // 包含日期+时间+毫秒
|
|
|
+ // 取毫秒位数
|
|
|
+ int msLen = len - datetimeStr.indexOf(".") - 1;
|
|
|
+ StringBuilder ms = new StringBuilder();
|
|
|
+ for (int i = 0; i < msLen; i++) {
|
|
|
+ ms.append("S");
|
|
|
+ }
|
|
|
+ String formatter = "yyyy-MM-dd HH:mm:ss." + ms;
|
|
|
+
|
|
|
+ DateTimeFormatter dateTimeFormatter = dateFormatterCache.get(formatter);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(datetimeStr, dateTimeFormatter);
|
|
|
+ return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ } else if (datetimeStr.contains("-") && datetimeStr.contains(":")) {
|
|
|
+ // 包含日期+时间
|
|
|
+ // 判断包含时间位数
|
|
|
+ int i = datetimeStr.indexOf(":");
|
|
|
+ i = datetimeStr.indexOf(":", i + 1);
|
|
|
+ String formatter;
|
|
|
+ if (i > -1) {
|
|
|
+ formatter = "yyyy-MM-dd HH:mm:ss";
|
|
|
+ } else {
|
|
|
+ formatter = "yyyy-MM-dd HH:mm";
|
|
|
+ }
|
|
|
+
|
|
|
+ DateTimeFormatter dateTimeFormatter = dateFormatterCache.get(formatter);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(datetimeStr, dateTimeFormatter);
|
|
|
+ return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ } else if (datetimeStr.contains("-")) {
|
|
|
+ // 只包含日期
|
|
|
+ String formatter = "yyyy-MM-dd";
|
|
|
+ DateTimeFormatter dateTimeFormatter = dateFormatterCache.get(formatter);
|
|
|
+ LocalDate localDate = LocalDate.parse(datetimeStr, dateTimeFormatter);
|
|
|
+ return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ } else if (datetimeStr.contains(":")) {
|
|
|
+ // 只包含时间
|
|
|
+ String formatter;
|
|
|
+ if (datetimeStr.contains(".")) {
|
|
|
+ // 包含毫秒
|
|
|
+ int msLen = len - datetimeStr.indexOf(".") - 1;
|
|
|
+ StringBuilder ms = new StringBuilder();
|
|
|
+ for (int i = 0; i < msLen; i++) {
|
|
|
+ ms.append("S");
|
|
|
+ }
|
|
|
+ formatter = "HH:mm:ss." + ms;
|
|
|
+ } else {
|
|
|
+ // 判断包含时间位数
|
|
|
+ int i = datetimeStr.indexOf(":");
|
|
|
+ i = datetimeStr.indexOf(":", i + 1);
|
|
|
+ if (i > -1) {
|
|
|
+ formatter = "HH:mm:ss";
|
|
|
+ } else {
|
|
|
+ formatter = "HH:mm";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DateTimeFormatter dateTimeFormatter = dateFormatterCache.get(formatter);
|
|
|
+ LocalTime localTime = LocalTime.parse(datetimeStr, dateTimeFormatter);
|
|
|
+ LocalDate localDate = LocalDate.of(1970, Month.JANUARY, 1);
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
|
|
|
+ return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|