package org.rakam.util; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatterBuilder; import org.joda.time.format.DateTimeParser; import org.joda.time.format.DateTimePrinter; import org.joda.time.format.ISODateTimeFormat; import java.time.ZoneOffset; import java.util.concurrent.TimeUnit; public class DateTimeUtils { private DateTimeUtils() { } public static final java.time.format.DateTimeFormatter TIMESTAMP_FORMATTER = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").withZone(ZoneOffset.UTC); private static final DateTimeFormatter DATE_FORMATTER = ISODateTimeFormat.date().withZoneUTC(); private static final DateTimeFormatter TIMESTAMP_WITHOUT_TIME_ZONE_FORMATTER; private static final DateTimeFormatter TIMESTAMP_WITH_TIME_ZONE_FORMATTER; public static int parseDate(String value) { return (int) TimeUnit.MILLISECONDS.toDays(DATE_FORMATTER.parseMillis(value)); } static { DateTimeParser[] timestampWithoutTimeZoneParser = { DateTimeFormat.forPattern("yyyy-M-d").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s.SSS").getParser()}; DateTimePrinter timestampWithoutTimeZonePrinter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").getPrinter(); TIMESTAMP_WITHOUT_TIME_ZONE_FORMATTER = new DateTimeFormatterBuilder() .append(timestampWithoutTimeZonePrinter, timestampWithoutTimeZoneParser) .toFormatter() .withOffsetParsed(); DateTimeParser[] timestampWithTimeZoneParser = { DateTimeFormat.forPattern("yyyy-M-dZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d Z").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:mZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m Z").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:sZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s Z").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s.SSSZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s.SSS Z").getParser(), DateTimeFormat.forPattern("yyyy-M-dZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d ZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:mZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m ZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:sZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s ZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s.SSSZZZ").getParser(), DateTimeFormat.forPattern("yyyy-M-d H:m:s.SSS ZZZ").getParser()}; DateTimePrinter timestampWithTimeZonePrinter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS ZZZ").getPrinter(); TIMESTAMP_WITH_TIME_ZONE_FORMATTER = new DateTimeFormatterBuilder() .append(timestampWithTimeZonePrinter, timestampWithTimeZoneParser) .toFormatter() .withOffsetParsed(); } public static long parseTimestamp(Number timestampWithTimeZone) { return timestampWithTimeZone.longValue(); } public static long parseTimestamp(Object timestampWithTimeZone) { if (timestampWithTimeZone instanceof Number) { return parseTimestamp((Number) timestampWithTimeZone); } else if (timestampWithTimeZone instanceof String) { String encoded = timestampWithTimeZone.toString(); // Joda parses [0-9]{10} as TIMESTAMP with huge value so we limit the characters. if (encoded.length() > 12) { parseTimestamp(encoded); } } throw new RuntimeException("Invalid TIMESTAMP"); } public static long parseTimestamp(String timestampWithTimeZone) { if (timestampWithTimeZone.length() <= 12) { throw new IllegalArgumentException(); } try { return ISODateTimeFormat.dateTimeParser().parseMillis(timestampWithTimeZone); } catch (Exception e) { try { return TIMESTAMP_WITHOUT_TIME_ZONE_FORMATTER.parseMillis(timestampWithTimeZone); } catch (Exception ex) { return TIMESTAMP_WITH_TIME_ZONE_FORMATTER.parseMillis(timestampWithTimeZone); } } } }