in flink-cdc-connect/flink-cdc-source-connectors/flink-connector-mysql-cdc/src/main/java/io/debezium/connector/mysql/MySqlDefaultValueConverter.java [407:504]
private String cleanTimestamp(String s) {
if (s == null) {
throw new java.lang.IllegalArgumentException("null string");
}
s = s.trim();
// clean first dash
s = replaceFirstNonNumericSubstring(s, 0, '-');
// clean second dash
s = replaceFirstNonNumericSubstring(s, s.indexOf('-') + 1, '-');
// clean dividing space
s = replaceFirstNonNumericSubstring(s, s.indexOf('-', s.indexOf('-') + 1) + 1, ' ');
if (s.indexOf(' ') != -1) {
// clean first colon
s = replaceFirstNonNumericSubstring(s, s.indexOf(' ') + 1, ':');
if (s.indexOf(':') != -1) {
// clean second colon
s = replaceFirstNonNumericSubstring(s, s.indexOf(':') + 1, ':');
}
}
final int maxMonth = 12;
final int maxDay = 31;
// Parse the date
int firstDash = s.indexOf('-');
int secondDash = s.indexOf('-', firstDash + 1);
int dividingSpace = s.indexOf(' ');
// Parse the time
int firstColon = s.indexOf(':', dividingSpace + 1);
int secondColon = s.indexOf(':', firstColon + 1);
int period = s.indexOf('.', secondColon + 1);
int year = 0;
int month = 0;
int day = 0;
int hour = 0;
int minute = 0;
int second = 0;
// Get the date
int len = s.length();
boolean parsedDate = false;
if (firstDash > 0 && secondDash > firstDash) {
year = Integer.parseInt(s.substring(0, firstDash));
month = Integer.parseInt(s.substring(firstDash + 1, secondDash));
if (dividingSpace != -1) {
day = Integer.parseInt(s.substring(secondDash + 1, dividingSpace));
} else {
day = Integer.parseInt(s.substring(secondDash + 1, len));
}
if ((month >= 1 && month <= maxMonth) && (day >= 1 && day <= maxDay)) {
parsedDate = true;
}
}
if (!parsedDate) {
throw new java.lang.IllegalArgumentException("Cannot parse the date from " + s);
}
// Get the time. Hour, minute, second and colons are all optional
if (dividingSpace != -1 && dividingSpace < len - 1) {
if (firstColon == -1) {
hour = Integer.parseInt(s.substring(dividingSpace + 1, len));
} else {
hour = Integer.parseInt(s.substring(dividingSpace + 1, firstColon));
if (firstColon < len - 1) {
if (secondColon == -1) {
minute = Integer.parseInt(s.substring(firstColon + 1, len));
} else {
minute = Integer.parseInt(s.substring(firstColon + 1, secondColon));
if (secondColon < len - 1) {
if (period == -1) {
second = Integer.parseInt(s.substring(secondColon + 1, len));
} else {
second = Integer.parseInt(s.substring(secondColon + 1, period));
}
}
}
}
}
}
StringBuilder cleanedTimestamp = new StringBuilder();
cleanedTimestamp =
cleanedTimestamp.append(
String.format(
"%04d-%02d-%02d %02d:%02d:%02d",
year, month, day, hour, minute, second));
if (period != -1 && period < len - 1) {
cleanedTimestamp = cleanedTimestamp.append(".").append(s.substring(period + 1));
}
return cleanedTimestamp.toString();
}