@@ -118,6 +118,8 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
118118 formatter = ISODateTimeFormat .ordinalDateTimeNoMillis ();
119119 } else if ("time" .equals (input )) {
120120 formatter = ISODateTimeFormat .time ();
121+ } else if ("timeNoMillis" .equals (input ) || "time_no_millis" .equals (input )) {
122+ formatter = ISODateTimeFormat .timeNoMillis ();
121123 } else if ("tTime" .equals (input ) || "t_time" .equals (input )) {
122124 formatter = ISODateTimeFormat .tTime ();
123125 } else if ("tTimeNoMillis" .equals (input ) || "t_time_no_millis" .equals (input )) {
@@ -126,10 +128,14 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
126128 formatter = ISODateTimeFormat .weekDate ();
127129 } else if ("weekDateTime" .equals (input ) || "week_date_time" .equals (input )) {
128130 formatter = ISODateTimeFormat .weekDateTime ();
131+ } else if ("weekDateTimeNoMillis" .equals (input ) || "week_date_time_no_millis" .equals (input )) {
132+ formatter = ISODateTimeFormat .weekDateTimeNoMillis ();
129133 } else if ("weekyear" .equals (input ) || "week_year" .equals (input )) {
130134 formatter = ISODateTimeFormat .weekyear ();
131- } else if ("weekyearWeek" .equals (input )) {
135+ } else if ("weekyearWeek" .equals (input ) || "weekyear_week" . equals ( input ) ) {
132136 formatter = ISODateTimeFormat .weekyearWeek ();
137+ } else if ("weekyearWeekDay" .equals (input ) || "weekyear_week_day" .equals (input )) {
138+ formatter = ISODateTimeFormat .weekyearWeekDay ();
133139 } else if ("year" .equals (input )) {
134140 formatter = ISODateTimeFormat .year ();
135141 } else if ("yearMonth" .equals (input ) || "year_month" .equals (input )) {
@@ -140,6 +146,77 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
140146 formatter = new DateTimeFormatterBuilder ().append (new EpochTimePrinter (false ), new EpochTimeParser (false )).toFormatter ();
141147 } else if ("epoch_millis" .equals (input )) {
142148 formatter = new DateTimeFormatterBuilder ().append (new EpochTimePrinter (true ), new EpochTimeParser (true )).toFormatter ();
149+ // strict date formats here, must be at least 4 digits for year and two for months and two for day
150+ } else if ("strictBasicWeekDate" .equals (input ) || "strict_basic_week_date" .equals (input )) {
151+ formatter = StrictISODateTimeFormat .basicWeekDate ();
152+ } else if ("strictBasicWeekDateTime" .equals (input ) || "strict_basic_week_date_time" .equals (input )) {
153+ formatter = StrictISODateTimeFormat .basicWeekDateTime ();
154+ } else if ("strictBasicWeekDateTimeNoMillis" .equals (input ) || "strict_basic_week_date_time_no_millis" .equals (input )) {
155+ formatter = StrictISODateTimeFormat .basicWeekDateTimeNoMillis ();
156+ } else if ("strictDate" .equals (input ) || "strict_date" .equals (input )) {
157+ formatter = StrictISODateTimeFormat .date ();
158+ } else if ("strictDateHour" .equals (input ) || "strict_date_hour" .equals (input )) {
159+ formatter = StrictISODateTimeFormat .dateHour ();
160+ } else if ("strictDateHourMinute" .equals (input ) || "strict_date_hour_minute" .equals (input )) {
161+ formatter = StrictISODateTimeFormat .dateHourMinute ();
162+ } else if ("strictDateHourMinuteSecond" .equals (input ) || "strict_date_hour_minute_second" .equals (input )) {
163+ formatter = StrictISODateTimeFormat .dateHourMinuteSecond ();
164+ } else if ("strictDateHourMinuteSecondFraction" .equals (input ) || "strict_date_hour_minute_second_fraction" .equals (input )) {
165+ formatter = StrictISODateTimeFormat .dateHourMinuteSecondFraction ();
166+ } else if ("strictDateHourMinuteSecondMillis" .equals (input ) || "strict_date_hour_minute_second_millis" .equals (input )) {
167+ formatter = StrictISODateTimeFormat .dateHourMinuteSecondMillis ();
168+ } else if ("strictDateOptionalTime" .equals (input ) || "strict_date_optional_time" .equals (input )) {
169+ // in this case, we have a separate parser and printer since the dataOptionalTimeParser can't print
170+ // this sucks we should use the root local by default and not be dependent on the node
171+ return new FormatDateTimeFormatter (input ,
172+ StrictISODateTimeFormat .dateOptionalTimeParser ().withZone (DateTimeZone .UTC ),
173+ StrictISODateTimeFormat .dateTime ().withZone (DateTimeZone .UTC ), locale );
174+ } else if ("strictDateTime" .equals (input ) || "strict_date_time" .equals (input )) {
175+ formatter = StrictISODateTimeFormat .dateTime ();
176+ } else if ("strictDateTimeNoMillis" .equals (input ) || "strict_date_time_no_millis" .equals (input )) {
177+ formatter = StrictISODateTimeFormat .dateTimeNoMillis ();
178+ } else if ("strictHour" .equals (input ) || "strict_hour" .equals (input )) {
179+ formatter = StrictISODateTimeFormat .hour ();
180+ } else if ("strictHourMinute" .equals (input ) || "strict_hour_minute" .equals (input )) {
181+ formatter = StrictISODateTimeFormat .hourMinute ();
182+ } else if ("strictHourMinuteSecond" .equals (input ) || "strict_hour_minute_second" .equals (input )) {
183+ formatter = StrictISODateTimeFormat .hourMinuteSecond ();
184+ } else if ("strictHourMinuteSecondFraction" .equals (input ) || "strict_hour_minute_second_fraction" .equals (input )) {
185+ formatter = StrictISODateTimeFormat .hourMinuteSecondFraction ();
186+ } else if ("strictHourMinuteSecondMillis" .equals (input ) || "strict_hour_minute_second_millis" .equals (input )) {
187+ formatter = StrictISODateTimeFormat .hourMinuteSecondMillis ();
188+ } else if ("strictOrdinalDate" .equals (input ) || "strict_ordinal_date" .equals (input )) {
189+ formatter = StrictISODateTimeFormat .ordinalDate ();
190+ } else if ("strictOrdinalDateTime" .equals (input ) || "strict_ordinal_date_time" .equals (input )) {
191+ formatter = StrictISODateTimeFormat .ordinalDateTime ();
192+ } else if ("strictOrdinalDateTimeNoMillis" .equals (input ) || "strict_ordinal_date_time_no_millis" .equals (input )) {
193+ formatter = StrictISODateTimeFormat .ordinalDateTimeNoMillis ();
194+ } else if ("strictTime" .equals (input ) || "strict_time" .equals (input )) {
195+ formatter = StrictISODateTimeFormat .time ();
196+ } else if ("strictTimeNoMillis" .equals (input ) || "strict_time_no_millis" .equals (input )) {
197+ formatter = StrictISODateTimeFormat .timeNoMillis ();
198+ } else if ("strictTTime" .equals (input ) || "strict_t_time" .equals (input )) {
199+ formatter = StrictISODateTimeFormat .tTime ();
200+ } else if ("strictTTimeNoMillis" .equals (input ) || "strict_t_time_no_millis" .equals (input )) {
201+ formatter = StrictISODateTimeFormat .tTimeNoMillis ();
202+ } else if ("strictWeekDate" .equals (input ) || "strict_week_date" .equals (input )) {
203+ formatter = StrictISODateTimeFormat .weekDate ();
204+ } else if ("strictWeekDateTime" .equals (input ) || "strict_week_date_time" .equals (input )) {
205+ formatter = StrictISODateTimeFormat .weekDateTime ();
206+ } else if ("strictWeekDateTimeNoMillis" .equals (input ) || "strict_week_date_time_no_millis" .equals (input )) {
207+ formatter = StrictISODateTimeFormat .weekDateTimeNoMillis ();
208+ } else if ("strictWeekyear" .equals (input ) || "strict_weekyear" .equals (input )) {
209+ formatter = StrictISODateTimeFormat .weekyear ();
210+ } else if ("strictWeekyearWeek" .equals (input ) || "strict_weekyear_week" .equals (input )) {
211+ formatter = StrictISODateTimeFormat .weekyearWeek ();
212+ } else if ("strictWeekyearWeekDay" .equals (input ) || "strict_weekyear_week_day" .equals (input )) {
213+ formatter = StrictISODateTimeFormat .weekyearWeekDay ();
214+ } else if ("strictYear" .equals (input ) || "strict_year" .equals (input )) {
215+ formatter = StrictISODateTimeFormat .year ();
216+ } else if ("strictYearMonth" .equals (input ) || "strict_year_month" .equals (input )) {
217+ formatter = StrictISODateTimeFormat .yearMonth ();
218+ } else if ("strictYearMonthDay" .equals (input ) || "strict_year_month_day" .equals (input )) {
219+ formatter = StrictISODateTimeFormat .yearMonthDay ();
143220 } else if (Strings .hasLength (input ) && input .contains ("||" )) {
144221 String [] formats = Strings .delimitedListToStringArray (input , "||" );
145222 DateTimeParser [] parsers = new DateTimeParser [formats .length ];
@@ -171,6 +248,38 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
171248 return new FormatDateTimeFormatter (input , formatter .withZone (DateTimeZone .UTC ), locale );
172249 }
173250
251+ public static FormatDateTimeFormatter getStrictStandardDateFormatter () {
252+ // 2014/10/10
253+ DateTimeFormatter shortFormatter = new DateTimeFormatterBuilder ()
254+ .appendFixedDecimal (DateTimeFieldType .year (), 4 )
255+ .appendLiteral ('/' )
256+ .appendFixedDecimal (DateTimeFieldType .monthOfYear (), 2 )
257+ .appendLiteral ('/' )
258+ .appendFixedDecimal (DateTimeFieldType .dayOfMonth (), 2 )
259+ .toFormatter ()
260+ .withZoneUTC ();
261+
262+ // 2014/10/10 12:12:12
263+ DateTimeFormatter longFormatter = new DateTimeFormatterBuilder ()
264+ .appendFixedDecimal (DateTimeFieldType .year (), 4 )
265+ .appendLiteral ('/' )
266+ .appendFixedDecimal (DateTimeFieldType .monthOfYear (), 2 )
267+ .appendLiteral ('/' )
268+ .appendFixedDecimal (DateTimeFieldType .dayOfMonth (), 2 )
269+ .appendLiteral (' ' )
270+ .appendFixedSignedDecimal (DateTimeFieldType .hourOfDay (), 2 )
271+ .appendLiteral (':' )
272+ .appendFixedSignedDecimal (DateTimeFieldType .minuteOfHour (), 2 )
273+ .appendLiteral (':' )
274+ .appendFixedSignedDecimal (DateTimeFieldType .secondOfMinute (), 2 )
275+ .toFormatter ()
276+ .withZoneUTC ();
277+
278+ DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder ().append (longFormatter .withZone (DateTimeZone .UTC ).getPrinter (), new DateTimeParser [] {longFormatter .getParser (), shortFormatter .getParser ()});
279+
280+ return new FormatDateTimeFormatter ("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd" , builder .toFormatter ().withZone (DateTimeZone .UTC ), Locale .ROOT );
281+ }
282+
174283
175284 public static final DurationFieldType Quarters = new DurationFieldType ("quarters" ) {
176285 private static final long serialVersionUID = -8167713675442491871L ;
0 commit comments