1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.protocol.text.impl;
19
20 import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.protocol.text.PostgreSQLTextValueParser;
21 import org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
22 import org.postgresql.jdbc.TimestampUtils;
23
24 import java.sql.SQLException;
25 import java.sql.Timestamp;
26 import java.time.LocalDateTime;
27 import java.time.format.DateTimeFormatter;
28 import java.time.format.DateTimeParseException;
29
30
31
32
33 public final class PostgreSQLTimestampValueParser implements PostgreSQLTextValueParser<Timestamp> {
34
35 private static final DateTimeFormatter POSTGRESQL_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(
36 "[yyyy-MM-dd][yyyy_MM_dd][yyyyMMdd][yyyy-M-d][MM/dd/yy][yyMMdd]"
37 + "['T'][ ]"
38 + "[HH:mm:ss][HHmmss][HH:mm][HHmm]"
39 + "[.SSSSSSSSS][.SSSSSSSS][.SSSSSSS][.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]"
40 + "[ ]"
41 + "[XXXXX][XXXX][XXX][XX][X]");
42
43 @Override
44 public Timestamp parse(final String value) {
45 try {
46 return Timestamp.valueOf(LocalDateTime.from(POSTGRESQL_DATE_TIME_FORMATTER.parse(value)));
47 } catch (final DateTimeParseException ignored) {
48 return fallbackToPostgreSQLTimestampUtils(value);
49 }
50 }
51
52 private static Timestamp fallbackToPostgreSQLTimestampUtils(final String value) {
53 try {
54 return new TimestampUtils(false, null).toTimestamp(null, value);
55 } catch (final SQLException ex) {
56 throw new SQLWrapperException(ex);
57 }
58 }
59 }