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.Date; sascha@2357: import java.util.Calendar; sascha@2357: sascha@2357: import java.util.regex.Pattern; sascha@2357: import java.util.regex.Matcher; sascha@2357: sascha@2357: public final class DateGuesser { sascha@2357: public static final String [] MONTH = { sascha@2357: "jan", "feb", "mrz", "apr", "mai", "jun", sascha@2357: "jul", "aug", "sep", "okt", "nov", "dez" sascha@2357: }; sascha@2357: sascha@2357: public static final int guessMonth(String s) { sascha@2357: s = s.toLowerCase(); sascha@2357: for (int i = 0; i < MONTH.length; ++i) sascha@2357: if (MONTH[i].equals(s)) { sascha@2357: return i; sascha@2357: } sascha@2357: return -1; sascha@2357: } sascha@2357: sascha@2357: public static final Pattern YYYY_MM_DD = sascha@2357: Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$"); sascha@2357: sascha@2357: public static final Pattern DD_MM_YYYY = sascha@2357: Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})$"); sascha@2357: sascha@2357: public static final Pattern MMM_YYYY = sascha@2357: Pattern.compile("^(\\d{0,2})\\.?(\\w{3})\\.?(\\d{2,4})$"); sascha@2357: sascha@2357: public static final Pattern GARBAGE_YYYY = sascha@2357: Pattern.compile("^\\D*(\\d{2,4})$"); sascha@2357: sascha@2357: public static final Pattern YYYY_MM_DDThh_mm = sascha@2357: 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 = tom@8856: Pattern.compile( tom@8856: "^(\\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 = tom@8856: Pattern.compile( tom@8856: "^(\\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 = tom@8856: Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})" tom@8856: + "T(\\d{1,2}):(\\d{2}):(\\d{2})$"); sascha@2357: felix@4763: public static final Pattern DDMMYY = teichmann@5895: Pattern.compile("^(\\d{2})(\\d{2})(\\d{2})$"); felix@4763: sascha@2357: private DateGuesser() { sascha@2357: } sascha@2357: sascha@2357: public static final int calendarMonth(String month) { sascha@2357: return calendarMonth(Integer.parseInt(month)); sascha@2357: } sascha@2357: sascha@2357: public static final int calendarMonth(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: */ sascha@2357: public static Date guessDate(String s) { sascha@2357: if (s == null || (s = s.trim()).length() == 0) { sascha@2357: throw new IllegalArgumentException(); sascha@2357: } sascha@2357: sascha@2357: Matcher m; sascha@2357: sascha@2357: m = YYYY_MM_DD.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(1); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(3); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year), sascha@2357: calendarMonth(month), sascha@2357: Integer.parseInt(day), sascha@2357: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: m = DD_MM_YYYY.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(3); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(1); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), sascha@2357: calendarMonth(month), teichmann@5895: Integer.parseInt(day), sascha@2357: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: m = MMM_YYYY.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: int month = guessMonth(m.group(2)); sascha@2357: if (month >= 0) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(3); sascha@2357: String day = m.group(1); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), sascha@2357: month, sascha@2357: day.length() == 0 ? 15 : Integer.parseInt(day), sascha@2357: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: } sascha@2357: sascha@2357: m = YYYY_MM_DDThh_mm.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(1); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(3); sascha@2357: String hour = m.group(4); sascha@2357: String minute = m.group(5); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year), sascha@2357: calendarMonth(month), sascha@2357: Integer.parseInt(day), sascha@2357: Integer.parseInt(hour), sascha@2357: Integer.parseInt(minute), sascha@2357: 0 sascha@2357: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: m = YYYY_MM_DDThh_mm_ss.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(1); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(3); sascha@2357: String hour = m.group(4); sascha@2357: String minute = m.group(5); sascha@2357: String second = m.group(6); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year), sascha@2357: calendarMonth(month), sascha@2357: Integer.parseInt(day), sascha@2357: Integer.parseInt(hour), sascha@2357: Integer.parseInt(minute), sascha@2357: Integer.parseInt(second) sascha@2357: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: m = DD_MM_YYYYThh_mm.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(3); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(1); sascha@2357: String hour = m.group(4); sascha@2357: String minute = m.group(5); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), sascha@2357: calendarMonth(month), sascha@2357: Integer.parseInt(day), sascha@2357: Integer.parseInt(hour), sascha@2357: Integer.parseInt(minute), sascha@2357: 0 sascha@2357: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: m = DD_MM_YYYYThh_mm_ss.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(3); sascha@2357: String month = m.group(2); sascha@2357: String day = m.group(1); sascha@2357: String hour = m.group(4); sascha@2357: String minute = m.group(5); sascha@2357: String second = m.group(6); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), sascha@2357: calendarMonth(month), sascha@2357: Integer.parseInt(day), sascha@2357: Integer.parseInt(hour), sascha@2357: Integer.parseInt(minute), sascha@2357: Integer.parseInt(second) sascha@2357: ); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: felix@4763: m = DDMMYY.matcher(s); felix@4763: felix@4763: if (m.matches()) { felix@4763: Calendar cal = Calendar.getInstance(); felix@4763: String day = m.group(1); felix@4763: String month = m.group(2); teichmann@4770: 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: } teichmann@5895: cal.clear(); felix@4763: cal.set( felix@4763: year, felix@4763: Integer.parseInt(month), // month felix@4763: Integer.parseInt(day), // day felix@4763: 12, 0, 0); felix@4763: return cal.getTime(); felix@4763: } felix@4763: sascha@2357: m = GARBAGE_YYYY.matcher(s); sascha@2357: sascha@2357: if (m.matches()) { sascha@2357: Calendar cal = Calendar.getInstance(); sascha@2357: String year = m.group(1); teichmann@5895: cal.clear(); sascha@2357: cal.set( sascha@2357: Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), sascha@2357: 5, // month sascha@2357: 15, // day sascha@2357: 12, 0, 0); sascha@2357: return cal.getTime(); sascha@2357: } sascha@2357: sascha@2357: throw new IllegalArgumentException(); sascha@2357: } sascha@2357: sascha@2357: public static void main(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