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

be.looorent.jflu.OffsetTimestampConverter Maven / Gradle / Ivy

The newest version!
package be.looorent.jflu;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Optional;

import static java.time.ZoneOffset.UTC;
import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
import static java.time.format.DateTimeFormatter.ofPattern;
import static java.util.Arrays.asList;
import static java.util.Optional.empty;
import static java.util.Optional.of;

// TODO This should be merged with TimestampConverter
public class OffsetTimestampConverter {
    private static final Logger LOG = LoggerFactory.getLogger(OffsetTimestampConverter.class);
    private static final List DATE_FORMATS = asList(
            ofPattern("yyyy-MM-dd HH:mm:ss XXX"),
            ofPattern("yyyy-MM-dd HH:mm:ss X"),
            ofPattern("yyyy-MM-dd HH:mm:ss"),
            ISO_DATE_TIME
    );

    private OffsetTimestampConverter() {
        // Only static methods
    }

    public static Optional convertToLocalDateTimeInUtc(String dateAsString) {
        if (dateAsString == null) {
            return empty();
        } else {
            String sanitized = dateAsString.replace("UTC", "Z");
            Optional parsed = DATE_FORMATS.stream()
                    .map(formatter -> parseDate(formatter, sanitized))
                    .filter(Optional::isPresent)
                    .map(Optional::get)
                    .map(time -> time.atZoneSameInstant(UTC))
                    .map(ZonedDateTime::toLocalDateTime)
                    .findFirst();
            if (parsed.isPresent()) {
                return parsed;
            } else {
                LOG.warn("Impossible to parse {}", dateAsString);
                return TimestampConverter.convertToLocalDateTime(convertToIso(dateAsString));
            }
        }
    }

    private static String convertToIso(String dateAsString) {
        StringBuilder builder = new StringBuilder(dateAsString);
        if (builder.length() > 11 && ' ' == builder.charAt(10)) {
            builder.setCharAt(10, 'T');
        }
        return builder.toString().replace("UTC", "Z").replaceAll(" ", "");
    }

    private static Optional parseDate(DateTimeFormatter formatter, String dateAsString) {
        try {
            return of(OffsetDateTime.parse(dateAsString, formatter));
        } catch (Exception e) {
            return empty();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy