package org.atomnuke.syslog.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * TODO: Refactor into singleton * * @author zinic */ public final class RFC3339DateParser { private static final SimpleDateFormat RFC3339_BASIC_WITH_TZ = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); private static final SimpleDateFormat RFC3339_FRACTIONAL_WITH_TZ = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS"); private static final SimpleDateFormat RFC3339_BASIC_NO_TZ = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); private static final SimpleDateFormat RFC3339_FRACTIONAL_NO_TZ = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"); static { RFC3339_FRACTIONAL_NO_TZ.setLenient(Boolean.TRUE); } private RFC3339DateParser() { } public static Calendar parseRFC3339Date(String datestring) throws ParseException { final boolean hasFractionalSeconds = datestring.contains("."); final boolean hasUTCTimezone = datestring.contains("Z"); Date parsedDate; if (hasUTCTimezone) { parsedDate = hasFractionalSeconds ? RFC3339_FRACTIONAL_NO_TZ.parse(datestring) : RFC3339_BASIC_NO_TZ.parse(datestring); } else { parsedDate = hasFractionalSeconds ? RFC3339_FRACTIONAL_WITH_TZ.parse(datestring) : RFC3339_BASIC_WITH_TZ.parse(datestring); } // Set our time final Calendar calendarRepresentation = Calendar.getInstance(); calendarRepresentation.setTime(parsedDate); return calendarRepresentation; } }