teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH sascha@2357: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. sascha@2357: */ sascha@2357: teichmann@8187: package org.dive4elements.river.backend.utils; teichmann@5844: sascha@2357: import java.util.Calendar; mschaefer@8969: import java.util.Date; mschaefer@8969: import java.util.regex.Matcher; sascha@2357: import java.util.regex.Pattern; sascha@2357: mschaefer@9055: import org.dive4elements.river.model.TimeInterval; mschaefer@9055: sascha@2357: public final class DateGuesser { sascha@2357: public static final String [] MONTH = { mschaefer@8969: "jan", "feb", "mrz", "apr", "mai", "jun", mschaefer@8969: "jul", "aug", "sep", "okt", "nov", "dez" sascha@2357: }; sascha@2357: mschaefer@8969: public static final int guessMonth(final String s) { mschaefer@8969: final String t = s.toLowerCase(); sascha@2357: for (int i = 0; i < MONTH.length; ++i) mschaefer@8969: if (MONTH[i].equals(t)) { sascha@2357: return i; sascha@2357: } sascha@2357: return -1; sascha@2357: } sascha@2357: sascha@2357: public static final Pattern YYYY_MM_DD = mschaefer@8969: Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$"); sascha@2357: sascha@2357: public static final Pattern DD_MM_YYYY = mschaefer@8969: Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})$"); sascha@2357: sascha@2357: public static final Pattern MMM_YYYY = mschaefer@8969: Pattern.compile("^((\\d{1,2})\\.)?(\\w{3})[\\. -]?((\\d\\d)|(\\d{4}))$"); sascha@2357: sascha@2357: public static final Pattern GARBAGE_YYYY = mschaefer@8969: Pattern.compile("^[^\\d=]*((\\d\\d)|([12]\\d{3}))$"); sascha@2357: sascha@2357: public static final Pattern YYYY_MM_DDThh_mm = mschaefer@8969: Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$"); sascha@2357: sascha@2357: public static final Pattern YYYY_MM_DDThh_mm_ss = mschaefer@8969: Pattern.compile( mschaefer@8969: "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$"); sascha@2357: sascha@2357: public static final Pattern DD_MM_YYYYThh_mm = mschaefer@8969: Pattern.compile( mschaefer@8969: "^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2})$"); sascha@2357: sascha@2357: public static final Pattern DD_MM_YYYYThh_mm_ss = mschaefer@8969: Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})" mschaefer@8969: + "T(\\d{1,2}):(\\d{2}):(\\d{2})$"); sascha@2357: felix@4763: public static final Pattern DDMMYY = mschaefer@8969: Pattern.compile("^(\\d{2})(\\d{2})(\\d{2})$"); felix@4763: sascha@2357: private DateGuesser() { sascha@2357: } sascha@2357: mschaefer@8969: public static final int calendarMonth(final String month) { sascha@2357: return calendarMonth(Integer.parseInt(month)); sascha@2357: } sascha@2357: mschaefer@8969: public static final int calendarMonth(final int month) { sascha@2357: return Math.max(Math.min(month-1, 11), 0); sascha@2357: } sascha@2357: felix@4764: /** felix@4764: * Guess date by trying all different patterns. felix@4764: * Throws IllegalArgumentException if not able to guess. felix@4764: * @param s The date to be guessed (e.g. 11.02.2001). felix@4764: * @return the parsed Date. felix@4764: */ mschaefer@8969: public static Date guessDate(final String s) { mschaefer@8969: if ((s == null) || s.trim().isEmpty()) { sascha@2357: throw new IllegalArgumentException(); sascha@2357: } sascha@2357: mschaefer@8969: final String t = s.trim(); sascha@2357: Matcher m; sascha@2357: mschaefer@8969: m = YYYY_MM_DD.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(1); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(3); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: mschaefer@8969: m = DD_MM_YYYY.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(3); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(1); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: mschaefer@8969: m = MMM_YYYY.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final int month = guessMonth(m.group(3)); sascha@2357: if (month >= 0) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(4); mschaefer@8969: final String day = m.group(1); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), mschaefer@8969: month, mschaefer@8969: ((day == null) || day.isEmpty()) ? 15 : Integer.parseInt(day), mschaefer@8969: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: } sascha@2357: mschaefer@8969: m = YYYY_MM_DDThh_mm.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(1); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(3); mschaefer@8969: final String hour = m.group(4); mschaefer@8969: final String minute = m.group(5); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: Integer.parseInt(hour), mschaefer@8969: Integer.parseInt(minute), mschaefer@8969: 0 mschaefer@8969: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: mschaefer@8969: m = YYYY_MM_DDThh_mm_ss.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(1); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(3); mschaefer@8969: final String hour = m.group(4); mschaefer@8969: final String minute = m.group(5); mschaefer@8969: final String second = m.group(6); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: Integer.parseInt(hour), mschaefer@8969: Integer.parseInt(minute), mschaefer@8969: Integer.parseInt(second) mschaefer@8969: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: mschaefer@8969: m = DD_MM_YYYYThh_mm.matcher(t); sascha@2357: sascha@2357: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(3); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(1); mschaefer@8969: final String hour = m.group(4); mschaefer@8969: final String minute = m.group(5); teichmann@5895: cal.clear(); sascha@2357: cal.set( mschaefer@8969: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: Integer.parseInt(hour), mschaefer@8969: Integer.parseInt(minute), mschaefer@8969: 0 mschaefer@8969: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: mschaefer@8969: m = DD_MM_YYYYThh_mm_ss.matcher(t); felix@4763: felix@4763: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(3); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String day = m.group(1); mschaefer@8969: final String hour = m.group(4); mschaefer@8969: final String minute = m.group(5); mschaefer@8969: final String second = m.group(6); mschaefer@8969: cal.clear(); mschaefer@8969: cal.set( mschaefer@8969: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), mschaefer@8969: calendarMonth(month), mschaefer@8969: Integer.parseInt(day), mschaefer@8969: Integer.parseInt(hour), mschaefer@8969: Integer.parseInt(minute), mschaefer@8969: Integer.parseInt(second) mschaefer@8969: ); mschaefer@8969: return cal.getTime(); mschaefer@8969: } mschaefer@8969: mschaefer@8969: m = DDMMYY.matcher(t); mschaefer@8969: mschaefer@8969: if (m.matches()) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String day = m.group(1); mschaefer@8969: final String month = m.group(2); mschaefer@8969: final String yearS = m.group(3); teichmann@4770: int year = Integer.parseInt(yearS); teichmann@4770: teichmann@4770: if (year <= cal.get(Calendar.YEAR) % 100) { felix@4763: year += 2000; felix@4763: } felix@4763: else { felix@4763: year += 1900; felix@4763: } mschaefer@8969: // TODO Warning: two digit year teichmann@5895: cal.clear(); felix@4763: cal.set( mschaefer@8969: year, mschaefer@8969: Integer.parseInt(month), // month mschaefer@8969: Integer.parseInt(day), // day mschaefer@8969: 12, 0, 0); felix@4763: return cal.getTime(); felix@4763: } felix@4763: mschaefer@8969: m = GARBAGE_YYYY.matcher(t); sascha@2357: mschaefer@8969: if (m.matches() && !t.contains("HQ") && !t.contains("HW")) { mschaefer@8969: final Calendar cal = Calendar.getInstance(); mschaefer@8969: final String year = m.group(1); teichmann@5895: cal.clear(); mschaefer@9055: cal.set(Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), mschaefer@9055: TimeInterval.YEAR_ONLY_DATE.get(Calendar.MONTH), mschaefer@9055: TimeInterval.YEAR_ONLY_DATE.get(Calendar.DAY_OF_MONTH), mschaefer@9055: TimeInterval.YEAR_ONLY_DATE.get(Calendar.HOUR_OF_DAY), mschaefer@9055: TimeInterval.YEAR_ONLY_DATE.get(Calendar.MINUTE), mschaefer@9055: TimeInterval.YEAR_ONLY_DATE.get(Calendar.SECOND)); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: throw new IllegalArgumentException(); sascha@2357: } sascha@2357: mschaefer@8969: public static void main(final String [] args) { sascha@2357: for (int i = 0; i < args.length; ++i) { sascha@2357: System.out.println(args[i] + ": " + guessDate(args[i])); sascha@2357: } sascha@2357: } sascha@2357: } sascha@2357: // end of file