Mercurial > dive4elements > river
view flys-backend/src/main/java/de/intevation/flys/utils/DateGuesser.java @ 4837:9e25c7523485
Fixed calculation of effective width in MINFO SQ relation.
* Get all (including empty datasets) from db.
* Filter empty datasets when processing data of the same date.
* Added debug outputs.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Wed, 23 Jan 2013 11:14:41 +0100 |
parents | 28fa48986ae9 |
children |
line wrap: on
line source
package de.intevation.flys.utils; /** * Copyright (c) 2006 by Intevation GmbH * * @author Sascha L. Teichmann (teichmann@intevation.de) * * This program is free software under the LGPL (>=v2.1) * Read the file LGPL coming with FLYS for details. */ import java.util.Date; import java.util.Calendar; import java.util.regex.Pattern; import java.util.regex.Matcher; public final class DateGuesser { public static final String [] MONTH = { "jan", "feb", "mrz", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "dez" }; public static final int guessMonth(String s) { s = s.toLowerCase(); for (int i = 0; i < MONTH.length; ++i) if (MONTH[i].equals(s)) { return i; } return -1; } public static final Pattern YYYY_MM_DD = Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$"); public static final Pattern DD_MM_YYYY = Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})$"); public static final Pattern MMM_YYYY = Pattern.compile("^(\\d{0,2})\\.?(\\w{3})\\.?(\\d{2,4})$"); public static final Pattern GARBAGE_YYYY = Pattern.compile("^\\D*(\\d{2,4})$"); public static final Pattern YYYY_MM_DDThh_mm = Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$"); public static final Pattern YYYY_MM_DDThh_mm_ss = Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$"); public static final Pattern DD_MM_YYYYThh_mm = Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2})$"); public static final Pattern DD_MM_YYYYThh_mm_ss = Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2}):(\\d{2})$"); public static final Pattern DDMMYY = Pattern.compile("^(\\d{1,2})(\\d{1,2})(\\d{1,2})$"); private DateGuesser() { } public static final int calendarMonth(String month) { return calendarMonth(Integer.parseInt(month)); } public static final int calendarMonth(int month) { return Math.max(Math.min(month-1, 11), 0); } /** * Guess date by trying all different patterns. * Throws IllegalArgumentException if not able to guess. * @param s The date to be guessed (e.g. 11.02.2001). * @return the parsed Date. */ public static Date guessDate(String s) { if (s == null || (s = s.trim()).length() == 0) { throw new IllegalArgumentException(); } Matcher m; m = YYYY_MM_DD.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(1); String month = m.group(2); String day = m.group(3); cal.set( Integer.parseInt(year), calendarMonth(month), Integer.parseInt(day), 12, 0, 0); return cal.getTime(); } m = DD_MM_YYYY.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(3); String month = m.group(2); String day = m.group(1); cal.set( Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), calendarMonth(month), Integer.parseInt(m.group(1)), 12, 0, 0); return cal.getTime(); } m = MMM_YYYY.matcher(s); if (m.matches()) { int month = guessMonth(m.group(2)); if (month >= 0) { Calendar cal = Calendar.getInstance(); String year = m.group(3); String day = m.group(1); cal.set( Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), month, day.length() == 0 ? 15 : Integer.parseInt(day), 12, 0, 0); return cal.getTime(); } } m = YYYY_MM_DDThh_mm.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(1); String month = m.group(2); String day = m.group(3); String hour = m.group(4); String minute = m.group(5); cal.set( Integer.parseInt(year), calendarMonth(month), Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(minute), 0 ); return cal.getTime(); } m = YYYY_MM_DDThh_mm_ss.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(1); String month = m.group(2); String day = m.group(3); String hour = m.group(4); String minute = m.group(5); String second = m.group(6); cal.set( Integer.parseInt(year), calendarMonth(month), Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(minute), Integer.parseInt(second) ); return cal.getTime(); } m = DD_MM_YYYYThh_mm.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(3); String month = m.group(2); String day = m.group(1); String hour = m.group(4); String minute = m.group(5); cal.set( Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), calendarMonth(month), Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(minute), 0 ); return cal.getTime(); } m = DD_MM_YYYYThh_mm_ss.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(3); String month = m.group(2); String day = m.group(1); String hour = m.group(4); String minute = m.group(5); String second = m.group(6); cal.set( Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), calendarMonth(month), Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(minute), Integer.parseInt(second) ); return cal.getTime(); } m = DDMMYY.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String day = m.group(1); String month = m.group(2); String yearS = m.group(3); int year = Integer.parseInt(yearS); if (year <= cal.get(Calendar.YEAR) % 100) { year += 2000; } else { year += 1900; } cal.set( year, Integer.parseInt(month), // month Integer.parseInt(day), // day 12, 0, 0); return cal.getTime(); } m = GARBAGE_YYYY.matcher(s); if (m.matches()) { Calendar cal = Calendar.getInstance(); String year = m.group(1); cal.set( Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0), 5, // month 15, // day 12, 0, 0); return cal.getTime(); } throw new IllegalArgumentException(); } public static void main(String [] args) { for (int i = 0; i < args.length; ++i) { System.out.println(args[i] + ": " + guessDate(args[i])); } } } // end of file