Normand Briere
2018-07-07 e416acb9b012b17d1efe49ad2199ea7132d874d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package timeflow.format.field;
 
import java.text.*;
import java.util.*;
 
import timeflow.data.time.*;
 
public class DateTimeGuesser {
   
   private DateTimeParser lastGoodFormat;
   
   private static List<DateTimeParser> parsers=new ArrayList<DateTimeParser>();
 
   /*
    
   HANDY REFERENCE FOR SIMPLEDATEFORMAT:
   (quoted from Java documentation)
        
   Letter    Date or Time Component    Presentation    Examples
   G    Era designator    Text    AD
   y    Year    Year    1996; 96
   M    Month in year    Month    July; Jul; 07
   w    Week in year    Number    27
   W    Week in month    Number    2
   D    Day in year    Number    189
   d    Day in month    Number    10
   F    Day of week in month    Number    2
   E    Day in week    Text    Tuesday; Tue
   a    Am/pm marker    Text    PM
   H    Hour in day (0-23)    Number    0
   k    Hour in day (1-24)    Number    24
   K    Hour in am/pm (0-11)    Number    0
   h    Hour in am/pm (1-12)    Number    12
   m    Minute in hour    Number    30
   s    Second in minute    Number    55
   S    Millisecond    Number    978
   z    Time zone    General time zone    Pacific Standard Time; PST; GMT-08:00
   Z    Time zone    RFC 822 time zone    -0800
        
        */
       
   
   // the order of the list below matters--better not to put the year-only ones at the top,
   // because then the guesser succeeds before it has a chance to try parsing days.
   static
   {
       parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
       parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY));
       parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MMM dd yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY));
       parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH));
       parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH));
       parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH));
       parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR));
       parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR));
   }
   
   public DateTimeParser getLastGoodFormat()
   {
       return lastGoodFormat;
   }
 
   public RoughTime guess(String s)
   {
       // old code for trying the last good parser.
       // we took this out because if the last good one was for a single year,
       // but a new one is for years and days,
       // all you get is the year.
       
       //if (lastGoodFormat!=null)
       //try { return lastGoodFormat.parse(s); }
       //catch (ParseException e) {}    
       if (s==null || s.trim().length()==0)
           return null;
       for (DateTimeParser d: parsers)
       {
           try
           {
               RoughTime date= d.parse(s);
               lastGoodFormat=d;
               return date;
           }
           catch (ParseException e) {}
       }
       throw new IllegalArgumentException("Couldn't guess date: '"+s+"'");
   }
   
   public static void main(String[] args)
   {
       DateTimeGuesser g=new DateTimeGuesser();
       System.out.println(g.guess("2009-03-04"));
       System.out.println(g.guess("June 10, 2010"));
       System.out.println(g.guess("2010"));
       System.out.println(g.guess("3/17/10"));
   }
}