changeset 8969:fe81eb39080c

Avoid guessing year 1950 for HQ50 etc.
author mschaefer
date Tue, 03 Apr 2018 09:54:26 +0200
parents 66471a3b3db2
children da5dc7446652
files backend/src/main/java/org/dive4elements/river/backend/utils/DateGuesser.java
diffstat 1 files changed, 135 insertions(+), 134 deletions(-) [+]
line wrap: on
line diff
--- a/backend/src/main/java/org/dive4elements/river/backend/utils/DateGuesser.java	Tue Apr 03 08:30:23 2018 +0200
+++ b/backend/src/main/java/org/dive4elements/river/backend/utils/DateGuesser.java	Tue Apr 03 09:54:26 2018 +0200
@@ -8,65 +8,64 @@
 
 package org.dive4elements.river.backend.utils;
 
-import java.util.Date;
 import java.util.Calendar;
-
+import java.util.Date;
+import java.util.regex.Matcher;
 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"
+            "jan", "feb", "mrz", "apr", "mai", "jun",
+            "jul", "aug", "sep", "okt", "nov", "dez"
     };
 
-    public static final int guessMonth(String s) {
-        s = s.toLowerCase();
+    public static final int guessMonth(final String s) {
+        final String t = s.toLowerCase();
         for (int i = 0; i < MONTH.length; ++i)
-            if (MONTH[i].equals(s)) {
+            if (MONTH[i].equals(t)) {
                 return i;
             }
         return -1;
     }
 
     public static final Pattern YYYY_MM_DD =
-        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$");
+            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})$");
+            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})$");
+            Pattern.compile("^((\\d{1,2})\\.)?(\\w{3})[\\. -]?((\\d\\d)|(\\d{4}))$");
 
     public static final Pattern GARBAGE_YYYY =
-        Pattern.compile("^\\D*(\\d{2,4})$");
+            Pattern.compile("^[^\\d=]*((\\d\\d)|([12]\\d{3}))$");
 
     public static final Pattern YYYY_MM_DDThh_mm =
-        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$");
+            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})$");
+            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})$");
+            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})$");
+            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{2})(\\d{2})(\\d{2})$");
+            Pattern.compile("^(\\d{2})(\\d{2})(\\d{2})$");
 
     private DateGuesser() {
     }
 
-    public static final int calendarMonth(String month) {
+    public static final int calendarMonth(final String month) {
         return calendarMonth(Integer.parseInt(month));
     }
 
-    public static final int calendarMonth(int month) {
+    public static final int calendarMonth(final int month) {
         return Math.max(Math.min(month-1, 11), 0);
     }
 
@@ -76,156 +75,157 @@
      * @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) {
+    public static Date guessDate(final String s) {
+        if ((s == null) || s.trim().isEmpty()) {
             throw new IllegalArgumentException();
         }
 
+        final String t = s.trim();
         Matcher m;
 
-        m = YYYY_MM_DD.matcher(s);
+        m = YYYY_MM_DD.matcher(t);
 
         if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year  = m.group(1);
-            String month = m.group(2);
-            String day   = m.group(3);
+            final Calendar cal = Calendar.getInstance();
+            final String year  = m.group(1);
+            final String month = m.group(2);
+            final String day   = m.group(3);
             cal.clear();
             cal.set(
-                Integer.parseInt(year),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                12, 0, 0);
+                    Integer.parseInt(year),
+                    calendarMonth(month),
+                    Integer.parseInt(day),
+                    12, 0, 0);
             return cal.getTime();
         }
 
-        m = DD_MM_YYYY.matcher(s);
+        m = DD_MM_YYYY.matcher(t);
 
         if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year  = m.group(3);
-            String month = m.group(2);
-            String day   = m.group(1);
+            final Calendar cal = Calendar.getInstance();
+            final String year  = m.group(3);
+            final String month = m.group(2);
+            final String day   = m.group(1);
             cal.clear();
             cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                12, 0, 0);
+                    Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                    calendarMonth(month),
+                    Integer.parseInt(day),
+                    12, 0, 0);
             return cal.getTime();
         }
 
-        m = MMM_YYYY.matcher(s);
+        m = MMM_YYYY.matcher(t);
 
         if (m.matches()) {
-            int month = guessMonth(m.group(2));
+            final int month = guessMonth(m.group(3));
             if (month >= 0) {
-                Calendar cal = Calendar.getInstance();
-                String year = m.group(3);
-                String day  = m.group(1);
+                final Calendar cal = Calendar.getInstance();
+                final String year = m.group(4);
+                final String day = m.group(1);
                 cal.clear();
                 cal.set(
-                    Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                    month,
-                    day.length() == 0 ? 15 : Integer.parseInt(day),
-                    12, 0, 0);
+                        Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                        month,
+                        ((day == null) || day.isEmpty()) ? 15 : Integer.parseInt(day),
+                                12, 0, 0);
                 return cal.getTime();
             }
         }
 
-        m = YYYY_MM_DDThh_mm.matcher(s);
+        m = YYYY_MM_DDThh_mm.matcher(t);
 
         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);
+            final Calendar cal = Calendar.getInstance();
+            final String year = m.group(1);
+            final String month = m.group(2);
+            final String day = m.group(3);
+            final String hour = m.group(4);
+            final String minute = m.group(5);
             cal.clear();
             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.clear();
-            cal.set(
-                Integer.parseInt(year),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                Integer.parseInt(second)
-            );
+                    Integer.parseInt(year),
+                    calendarMonth(month),
+                    Integer.parseInt(day),
+                    Integer.parseInt(hour),
+                    Integer.parseInt(minute),
+                    0
+                    );
             return cal.getTime();
         }
 
-        m = DD_MM_YYYYThh_mm.matcher(s);
+        m = YYYY_MM_DDThh_mm_ss.matcher(t);
 
         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);
+            final Calendar cal = Calendar.getInstance();
+            final String year = m.group(1);
+            final String month = m.group(2);
+            final String day = m.group(3);
+            final String hour = m.group(4);
+            final String minute = m.group(5);
+            final String second = m.group(6);
             cal.clear();
             cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                0
-            );
+                    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_ss.matcher(s);
+        m = DD_MM_YYYYThh_mm.matcher(t);
 
         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);
+            final Calendar cal = Calendar.getInstance();
+            final String year = m.group(3);
+            final String month = m.group(2);
+            final String day = m.group(1);
+            final String hour = m.group(4);
+            final String minute = m.group(5);
             cal.clear();
             cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                Integer.parseInt(second)
-            );
+                    Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                    calendarMonth(month),
+                    Integer.parseInt(day),
+                    Integer.parseInt(hour),
+                    Integer.parseInt(minute),
+                    0
+                    );
             return cal.getTime();
         }
 
-        m = DDMMYY.matcher(s);
+        m = DD_MM_YYYYThh_mm_ss.matcher(t);
 
         if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String day   = m.group(1);
-            String month = m.group(2);
-            String yearS = m.group(3);
+            final Calendar cal = Calendar.getInstance();
+            final String year = m.group(3);
+            final String month = m.group(2);
+            final String day = m.group(1);
+            final String hour = m.group(4);
+            final String minute = m.group(5);
+            final String second = m.group(6);
+            cal.clear();
+            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(t);
+
+        if (m.matches()) {
+            final Calendar cal = Calendar.getInstance();
+            final String day   = m.group(1);
+            final String month = m.group(2);
+            final String yearS = m.group(3);
             int year = Integer.parseInt(yearS);
 
             if (year <= cal.get(Calendar.YEAR) % 100) {
@@ -234,33 +234,34 @@
             else {
                 year += 1900;
             }
+            // TODO Warning: two digit year
             cal.clear();
             cal.set(
-                year,
-                Integer.parseInt(month),  // month
-                Integer.parseInt(day), // day
-                12, 0, 0);
+                    year,
+                    Integer.parseInt(month),  // month
+                    Integer.parseInt(day), // day
+                    12, 0, 0);
             return cal.getTime();
         }
 
-        m = GARBAGE_YYYY.matcher(s);
+        m = GARBAGE_YYYY.matcher(t);
 
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(1);
+        if (m.matches() && !t.contains("HQ") && !t.contains("HW")) {
+            final Calendar cal = Calendar.getInstance();
+            final String year = m.group(1);
             cal.clear();
             cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                5,  // month
-                15, // day
-                12, 0, 0);
+                    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) {
+    public static void main(final String [] args) {
         for (int i = 0; i < args.length; ++i) {
             System.out.println(args[i] + ": " + guessDate(args[i]));
         }

http://dive4elements.wald.intevation.org