view flys-backend/src/main/java/de/intevation/flys/utils/DateGuesser.java @ 4198:1cdbd8a0c994

Added two new tables ClickableQDTable and ClickableWTable and made Ws and Qs clickable in historical discharge calculation. The new tables define listener interfaces (clicked lower or upper icon) to listen to user clicks. In addition to this, there is an enum ClickMode with NONE, SINGLE and RANGE options, which allows to specifiy, which icons are displayed in the tables. NONE means no icon for user clicks, SINGLE has 1 icon, RANGE 2 icons for lower and upper.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 22 Oct 2012 13:31:25 +0200
parents 2e18e12fac11
children 8195396b23ce
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 (&gt;=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})$");

    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);
    }

    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 = 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

http://dive4elements.wald.intevation.org