|  | @@ -300,19 +300,23 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public long parseToMilliseconds(Object value, @Nullable QueryParseContext context, boolean includeUpper) {
 | 
	
		
			
				|  |  | -        return parseToMilliseconds(value, context, includeUpper, null);
 | 
	
		
			
				|  |  | +        return parseToMilliseconds(value, context, includeUpper, null, dateMathParser);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public long parseToMilliseconds(Object value, @Nullable QueryParseContext context, boolean includeUpper, @Nullable DateTimeZone zone) {
 | 
	
		
			
				|  |  | +    public long parseToMilliseconds(Object value, @Nullable QueryParseContext context, boolean includeUpper, @Nullable DateTimeZone zone, @Nullable DateMathParser forcedDateParser) {
 | 
	
		
			
				|  |  |          if (value instanceof Number) {
 | 
	
		
			
				|  |  |              return ((Number) value).longValue();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        return parseToMilliseconds(convertToString(value), context, includeUpper, zone);
 | 
	
		
			
				|  |  | +        return parseToMilliseconds(convertToString(value), context, includeUpper, zone, forcedDateParser);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public long parseToMilliseconds(String value, @Nullable QueryParseContext context, boolean includeUpper, @Nullable DateTimeZone zone) {
 | 
	
		
			
				|  |  | +    public long parseToMilliseconds(String value, @Nullable QueryParseContext context, boolean includeUpper, @Nullable DateTimeZone zone, @Nullable DateMathParser forcedDateParser) {
 | 
	
		
			
				|  |  |          long now = context == null ? System.currentTimeMillis() : context.nowInMillis();
 | 
	
		
			
				|  |  | -        long time = includeUpper && roundCeil ? dateMathParser.parseRoundCeil(value, now, zone) : dateMathParser.parse(value, now, zone);
 | 
	
		
			
				|  |  | +        DateMathParser dateParser = dateMathParser;
 | 
	
		
			
				|  |  | +        if (forcedDateParser != null) {
 | 
	
		
			
				|  |  | +            dateParser = forcedDateParser;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        long time = includeUpper && roundCeil ? dateParser.parseRoundCeil(value, now, zone) : dateParser.parse(value, now, zone);
 | 
	
		
			
				|  |  |          return time;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -325,28 +329,28 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
 | 
	
		
			
				|  |  | -        return rangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, null, context);
 | 
	
		
			
				|  |  | +        return rangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, null, null, context);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable QueryParseContext context) {
 | 
	
		
			
				|  |  | +    public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable DateMathParser forcedDateParser, @Nullable QueryParseContext context) {
 | 
	
		
			
				|  |  |          return NumericRangeQuery.newLongRange(names.indexName(), precisionStep,
 | 
	
		
			
				|  |  | -                lowerTerm == null ? null : parseToMilliseconds(lowerTerm, context, false, timeZone),
 | 
	
		
			
				|  |  | -                upperTerm == null ? null : parseToMilliseconds(upperTerm, context, includeUpper, timeZone),
 | 
	
		
			
				|  |  | +                lowerTerm == null ? null : parseToMilliseconds(lowerTerm, context, false, timeZone, forcedDateParser == null ? dateMathParser : forcedDateParser),
 | 
	
		
			
				|  |  | +                upperTerm == null ? null : parseToMilliseconds(upperTerm, context, includeUpper, timeZone, forcedDateParser == null ? dateMathParser : forcedDateParser),
 | 
	
		
			
				|  |  |                  includeLower, includeUpper);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public Filter rangeFilter(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
 | 
	
		
			
				|  |  | -        return rangeFilter(lowerTerm, upperTerm, includeLower, includeUpper, null, context, null);
 | 
	
		
			
				|  |  | +        return rangeFilter(lowerTerm, upperTerm, includeLower, includeUpper, null, null, context, null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public Filter rangeFilter(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable QueryParseContext context, @Nullable Boolean explicitCaching) {
 | 
	
		
			
				|  |  | -        return rangeFilter(null, lowerTerm, upperTerm, includeLower, includeUpper, timeZone, context, explicitCaching);
 | 
	
		
			
				|  |  | +    public Filter rangeFilter(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable DateMathParser forcedDateParser, @Nullable QueryParseContext context, @Nullable Boolean explicitCaching) {
 | 
	
		
			
				|  |  | +        return rangeFilter(null, lowerTerm, upperTerm, includeLower, includeUpper, timeZone, forcedDateParser, context, explicitCaching);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public Filter rangeFilter(QueryParseContext parseContext, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
 | 
	
		
			
				|  |  | -        return rangeFilter(parseContext, lowerTerm, upperTerm, includeLower, includeUpper, null, context, null);
 | 
	
		
			
				|  |  | +        return rangeFilter(parseContext, lowerTerm, upperTerm, includeLower, includeUpper, null, null, context, null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /*
 | 
	
	
		
			
				|  | @@ -355,7 +359,7 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
 | 
	
		
			
				|  |  |       * - the object to parse is a String (does not apply to ms since epoch which are UTC based time values)
 | 
	
		
			
				|  |  |       * - the String to parse does not have already a timezone defined (ie. `2014-01-01T00:00:00+03:00`)
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    public Filter rangeFilter(QueryParseContext parseContext, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable QueryParseContext context, @Nullable Boolean explicitCaching) {
 | 
	
		
			
				|  |  | +    public Filter rangeFilter(QueryParseContext parseContext, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable DateMathParser forcedDateParser, @Nullable QueryParseContext context, @Nullable Boolean explicitCaching) {
 | 
	
		
			
				|  |  |          boolean cache;
 | 
	
		
			
				|  |  |          boolean cacheable = true;
 | 
	
		
			
				|  |  |          Long lowerVal = null;
 | 
	
	
		
			
				|  | @@ -366,7 +370,7 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  String value = convertToString(lowerTerm);
 | 
	
		
			
				|  |  |                  cacheable = !hasDateExpressionWithNoRounding(value);
 | 
	
		
			
				|  |  | -                lowerVal = parseToMilliseconds(value, context, false, timeZone);
 | 
	
		
			
				|  |  | +                lowerVal = parseToMilliseconds(value, context, false, timeZone, forcedDateParser);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (upperTerm != null) {
 | 
	
	
		
			
				|  | @@ -375,7 +379,7 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  String value = convertToString(upperTerm);
 | 
	
		
			
				|  |  |                  cacheable = cacheable && !hasDateExpressionWithNoRounding(value);
 | 
	
		
			
				|  |  | -                upperVal = parseToMilliseconds(value, context, includeUpper, timeZone);
 | 
	
		
			
				|  |  | +                upperVal = parseToMilliseconds(value, context, includeUpper, timeZone, forcedDateParser);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 |