6
6
package net .atomique .ksar ;
7
7
8
8
import net .atomique .ksar .xml .OSConfig ;
9
+
9
10
import org .slf4j .Logger ;
10
11
import org .slf4j .LoggerFactory ;
11
12
14
15
import java .time .LocalTime ;
15
16
import java .time .format .DateTimeFormatter ;
16
17
import java .time .format .DateTimeParseException ;
17
- import java .util .HashMap ;
18
- import java .util .Map ;
18
+ import java .util .List ;
19
+ import java .util .Locale ;
19
20
import java .util .TreeSet ;
21
+ import java .util .stream .Collectors ;
22
+ import java .util .stream .Stream ;
20
23
21
24
public abstract class AllParser {
22
25
23
26
private static final Logger log = LoggerFactory .getLogger (AllParser .class );
24
- private static final Map <String , String > DATE_FORMAT_REGEXPS = new HashMap <String , String >() {
25
- {
26
- put ("^\\ d{8}$" , "yyyyMMdd" );
27
- put ("^\\ d{1,2}-\\ d{1,2}-\\ d{4}$" , "dd-MM-yyyy" );
28
- put ("^\\ d{4}-\\ d{1,2}-\\ d{1,2}$" , "yyyy-MM-dd" );
29
- put ("^\\ d{1,2}/\\ d{1,2}/\\ d{4}$" , "MM/dd/yyyy" );
30
- put ("^\\ d{4}/\\ d{1,2}/\\ d{1,2}$" , "yyyy/MM/dd" );
31
- put ("^\\ d{1,2}\\ s[a-z]{3}\\ s\\ d{4}$" , "dd MMM yyyy" );
32
- put ("^\\ d{1,2}\\ s[a-z]{4,}\\ s\\ d{4}$" , "dd MMMM yyyy" );
33
- put ("^\\ d{1,2}-\\ d{1,2}-\\ d{2}$" , "dd-MM-yy" );
34
- put ("^\\ d{1,2}/\\ d{1,2}/\\ d{2}$" , "MM/dd/yy" );
35
- }
36
- };
27
+
28
+ private static final List <DateTimeFormatter > DATE_FORMATS = Stream .of (
29
+ "MM dd, yy" ,
30
+ "MM-dd-yy" ,
31
+ "MM/dd/yy" ,
32
+ "MM-dd-yyyy" ,
33
+ "MM/dd/yyyy" ,
34
+ "dd-MM-yy" ,
35
+ "dd.MM.yy" ,
36
+ "dd/MM/yy" ,
37
+ "dd.MM.yy." ,
38
+ "dd-MM-yyyy" ,
39
+ "dd.MM.yyyy" ,
40
+ "dd/MM/yyyy" ,
41
+ "dd.MM.yyyy." ,
42
+ "yy. MM. dd" ,
43
+ "yy-MM-dd" ,
44
+ "yy.MM.dd" ,
45
+ "yy/MM/dd" ,
46
+ "yy年MM月dd日" ,
47
+ "yy.dd.MM" ,
48
+ "yyyy. MM. dd" ,
49
+ "yyyy-MM-dd" ,
50
+ "yyyy.MM.dd" ,
51
+ "yyyy/MM/dd" ,
52
+ "yyyy.MM.dd." ,
53
+ "yyyy年MM月dd日" ,
54
+ "yyyy.dd.MM" ,
55
+ "yyyyMMdd" ,
56
+ "dd MMM yyyy" ,
57
+ "dd MMMM yyyy" ,
58
+ "MMM dd yyyy" ,
59
+ "MMMM dd yyyy"
60
+ ).map (p -> DateTimeFormatter .ofPattern (p , Locale .US )).collect (Collectors .toList ());
37
61
38
62
public AllParser () {
39
63
@@ -80,14 +104,7 @@ public boolean setDate(String s) {
80
104
}
81
105
82
106
try {
83
- DateTimeFormatter formatter ;
84
- if ("Automatic Detection" .equals (dateFormat )) {
85
- formatter = DateTimeFormatter .ofPattern (determineDateFormat (s ));
86
-
87
- } else {
88
- formatter = DateTimeFormatter .ofPattern (dateFormat );
89
- }
90
-
107
+ DateTimeFormatter formatter = getDateFormatter (s );
91
108
currentDate = LocalDate .parse (s , formatter );
92
109
93
110
parsedate = currentDate ;
@@ -109,6 +126,20 @@ public boolean setDate(String s) {
109
126
return true ;
110
127
}
111
128
129
+ private DateTimeFormatter getDateFormatter (String s ) {
130
+ if (dateFormatter != null ) {
131
+ return dateFormatter ;
132
+ }
133
+ DateTimeFormatter format = null ;
134
+ if ("Automatic Detection" .equals (dateFormat )) {
135
+ format = determineDateFormat (s );
136
+ } else {
137
+ format = DateTimeFormatter .ofPattern (dateFormat );
138
+ }
139
+ dateFormatter = format ;
140
+ return dateFormatter ;
141
+ }
142
+
112
143
public String getDate () {
113
144
if (sarStartDate .equals (sarEndDate )) {
114
145
return sarStartDate ;
@@ -125,13 +156,21 @@ public String getCurrentStat() {
125
156
return currentStat ;
126
157
}
127
158
128
- public static String determineDateFormat (String dateString ) {
129
- for (String regexp : DATE_FORMAT_REGEXPS .keySet ()) {
130
- if (dateString .toLowerCase ().matches (regexp )) {
131
- return DATE_FORMAT_REGEXPS .get (regexp );
159
+ public static DateTimeFormatter determineDateFormat (String dateString ) {
160
+ DateTimeFormatter best = null ;
161
+ LocalDate bestDate = null ;
162
+ for (DateTimeFormatter format : DATE_FORMATS ) {
163
+ try {
164
+ LocalDate nextDate = LocalDate .parse (dateString , format );
165
+ if (bestDate == null || nextDate .compareTo (bestDate ) >= 0 ) {
166
+ bestDate = nextDate ;
167
+ best = format ;
168
+ }
169
+ } catch (DateTimeParseException e ) {
170
+ /* ignore */
132
171
}
133
172
}
134
- return null ; // Unknown format.
173
+ return best ;
135
174
}
136
175
137
176
protected String sarStartDate = null ;
@@ -159,4 +198,6 @@ public static String determineDateFormat(String dateString) {
159
198
protected String dateFormat = "MM/dd/yy" ;
160
199
protected String timeFormat = "HH:mm:ss" ;
161
200
protected int timeColumn = 1 ;
201
+
202
+ private DateTimeFormatter dateFormatter ;
162
203
}
0 commit comments