millennium: nth MILLENNIUM era ;
strDate: strMonth ( numDayOfMonth | nth ) COMMA? numYear era;
-invStrDate: era numYear COMMA? strMonth numDayOfMonth ;
+invStrDate: era num COMMA? strMonth num
+| ( num | nth ) strMonth COMMA? num era ;
strDayInMonthRange: strMonth numDayOfMonth ( HYPHEN | DASH ) numDayOfMonth COMMA? numYear era ;
monthInYearRange: strMonth ( HYPHEN | DASH ) strMonth COMMA? numYear era ;
nthQuarterInYearRange: nthQuarter ( HYPHEN | DASH ) nthQuarter COMMA? numYear era ;
// Reorder the stack into a canonical ordering,
// year-month-day-era.
+ Era era = null;
- Integer dayOfMonth = (Integer) stack.pop();
- Integer numMonth = (Integer) stack.pop();
- Integer year = (Integer) stack.pop();
- Era era = (Era) stack.pop();
+ boolean eraLast = stack.peek() instanceof Integer;
+
+ // Declare nums
+ Integer num1;
+ Integer num2;
+ Integer num3;
+
+ if (eraLast) {
+ // Si
+ num1 = (Integer) stack.pop(); // year or day
+ num2 = (Integer) stack.pop(); // month
+ num3 = (Integer) stack.pop(); // year or day
+ era = (Era) stack.pop(); // era...
+ } else {
+ era = (Era) stack.pop(); // damn eras
+ num1 = (Integer) stack.pop(); // year or day
+ num2 = (Integer) stack.pop(); // month
+ num3 = (Integer) stack.pop(); // day
+ }
+
+ Integer dayOfMonth = num1;
+ Integer numMonth = num2;
+ Integer year = num3;
+
+ if (DateUtils.isValidDate(num3, num2, num1, era)) {
+ // Do nothing, already in the right format
+ } else if (DateUtils.isValidDate(num1, num2, num3, era)) {
+ dayOfMonth = num3;
+ year = num1;
+ }
stack.push(year);
stack.push(numMonth);
"3/4/2000?": # oneDisplayDate - with question mark
earliestSingleDate: [2000, 3, 4, CE]
+ "13 april 1995": # oneDisplayDate - with question mark
+ earliestSingleDate: [1995, 4, 13, CE]
+
+ "13 apr 1995": # oneDisplayDate - with question mark
+ earliestSingleDate: [1995, 4, 13, CE]
+
+ "13th APRIL 1995": # oneDisplayDate - with question mark
+ earliestSingleDate: [1995, 4, 13, CE]
+
# -------------------------------------------------------------------------------------------------------
# Invalid dates
# -------------------------------------------------------------------------------------------------------