All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.yandex.clickhouse.response.parser.ClickHouseSQLTimestampParser Maven / Gradle / Ivy

There is a newer version: 0.7.1-patch1
Show newest version
package ru.yandex.clickhouse.response.parser;

import java.sql.Timestamp;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.TimeZone;

import ru.yandex.clickhouse.response.ClickHouseColumnInfo;

final class ClickHouseSQLTimestampParser extends ClickHouseDateValueParser {

    private static final DateTimeFormatter DATE_TIME_FORMATTER_TZ =
        DateTimeFormatter.ofPattern("yyyy-MM-dd['T'][ ]HH:mm:ss[.SSS][XXX]");

    private static ClickHouseSQLTimestampParser instance;

    static ClickHouseSQLTimestampParser getInstance() {
        if (instance == null) {
            instance = new ClickHouseSQLTimestampParser();
        }
        return instance;
    }

    private ClickHouseSQLTimestampParser() {
        super(Timestamp.class);
    }

    @Override
    Timestamp parseDate(String value, ClickHouseColumnInfo columnInfo,
        TimeZone timeZone)
    {
        return Timestamp.from(dateToZonedDateTime(value, columnInfo, timeZone).toInstant());
    }

    @Override
    Timestamp parseDateTime(String value, ClickHouseColumnInfo columnInfo,
        TimeZone timeZone)
    {
        return Timestamp.from(dateTimeToZonedDateTime(value, columnInfo, timeZone).toInstant());
    }

    @Override
    Timestamp parseNumber(long value, ClickHouseColumnInfo columnInfo,
        TimeZone timeZone)
    {
        return Timestamp.from(parseAsInstant(value));
    }

    @Override
    Timestamp parseOther(String value, ClickHouseColumnInfo columnInfo,
        TimeZone timeZone)
    {
        try {
            return Timestamp.from(parseAsInstant(value));
        } catch (DateTimeParseException dtpe) {
            // try next pattern
        }

        try {
            return Timestamp.from(parseAsLocalDateTime(value)
                .atZone(effectiveTimeZone(columnInfo, timeZone))
                .toInstant());
        } catch (DateTimeParseException dtpe) {
            // not parseable as datetime
        }

        try {
            return Timestamp.from(
                OffsetDateTime.parse(
                    value, DATE_TIME_FORMATTER_TZ)
                .toInstant());
        } catch (DateTimeParseException dtpe) {
            // too bad, let's try another pattern
        }

        return Timestamp.from(
            OffsetDateTime.parse(
                value, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
            .toInstant());
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy