mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
增加时区判断
This commit is contained in:
@@ -6,7 +6,10 @@ import java.sql.Connection;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
import java.time.*;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -18,6 +21,10 @@ import org.joda.time.DateTimeZone;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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 {
|
public class Util {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(Util.class);
|
private static final Logger logger = LoggerFactory.getLogger(Util.class);
|
||||||
@@ -140,6 +147,17 @@ public class Util {
|
|||||||
return column;
|
return column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String UTC; // 当前时区
|
||||||
|
|
||||||
|
static {
|
||||||
|
TimeZone timeZone = TimeZone.getTimeZone(ZoneId.systemDefault().getId());
|
||||||
|
int currentTimeZone = timeZone.getOffset(System.currentTimeMillis()) * 10 / (1000 * 3600);
|
||||||
|
int tmp = currentTimeZone % 10;
|
||||||
|
int m = 60 * tmp / 10;
|
||||||
|
UTC = "+" + String.format("%02d", currentTimeZone / 10) + ":" + String.format("%02d", m);
|
||||||
|
TimeZone.setDefault(TimeZone.getTimeZone("GMT" + UTC));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用日期时间字符解析
|
* 通用日期时间字符解析
|
||||||
*
|
*
|
||||||
@@ -159,16 +177,92 @@ public class Util {
|
|||||||
datetimeStr = "T" + datetimeStr;
|
datetimeStr = "T" + datetimeStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime dateTime;
|
DateTime dateTime = new DateTime(datetimeStr, DateTimeZone.forID(UTC));
|
||||||
if (datetimeStr.startsWith("1940-06-03") || datetimeStr.startsWith("1941-03-16")
|
|
||||||
|| datetimeStr.startsWith("1986-05-04") || datetimeStr.startsWith("1987-04-12")
|
|
||||||
|| datetimeStr.startsWith("1988-04-10") || datetimeStr.startsWith("1989-04-16")
|
|
||||||
|| datetimeStr.startsWith("1990-04-15") || datetimeStr.startsWith("1991-04-14")) {
|
|
||||||
dateTime = new DateTime(datetimeStr, DateTimeZone.forID("+08:00"));
|
|
||||||
} else {
|
|
||||||
dateTime = new DateTime(datetimeStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dateTime.toDate();
|
return dateTime.toDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user