Class DateMathParser
A Simple Utility class for parsing "math" like strings relating to Dates.
The basic syntax support addition, subtraction and rounding at various levels of granularity (or "units"). Commands can be chained together and are parsed from left to right. '+' and '-' denote addition and subtraction, while '/' denotes "round". Round requires only a unit, while addition/subtraction require an integer value and a unit. Command strings must not include white space, but the "No-Op" command (empty string) is allowed....
/HOUR
... Round to the start of the current hour
/DAY
... Round to the start of the current day
+2YEARS
... Exactly two years in the future from now
-1DAY
... Exactly 1 day prior to now
/DAY+6MONTHS+3DAYS
... 6 months and 3 days in the future from the start of
the current day
+6MONTHS+3DAYS/DAY
... 6 months and 3 days in the future from now, rounded
down to nearest day
(Multiple aliases exist for the various units of time (ie:
MINUTE and MINUTES; MILLI,
MILLIS, MILLISECOND, and
MILLISECONDS.) The complete list can be found by
inspecting the keySet of CALENDAR_UNITS)
All commands are relative to a "now" which is fixed in an instance of
DateMathParser such that
p.parseMath("+0MILLISECOND").equals(p.parseMath("+0MILLISECOND"))
no matter how many wall clock milliseconds elapse between the two
distinct calls to parse (Assuming no other thread calls
"setNow" in the interim). The default value of 'now' is
the time at the moment the DateMathParser instance is
constructed, unless overridden by the NOW
request parameter.
All commands are also affected to the rules of a specified TimeZone
(including the start/end of DST if any) which determine when each arbitrary
day starts. This not only impacts rounding/adding of DAYs, but also
cascades to rounding of HOUR, MIN, MONTH, YEAR as well. The default
TimeZone used is UTC unless overridden by the
TZ request parameter.
Historical dates: The calendar computation is completely done with the
Gregorian system/algorithm. It does not switch to Julian or
anything else, unlike the default GregorianCalendar.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final Map<String,ChronoUnit> A mapping from (uppercased) String labels identifying time units, to the correspondingChronoUnitvalue (e.g.static final TimeZoneDefault TimeZone for DateMath rounding (UTC)static final DateTimeFormatterDiffers byDateTimeFormatter.ISO_INSTANTin that it's lenient.static final TimeZone -
Constructor Summary
ConstructorsConstructorDescriptionDefault constructor that assumes UTC should be used for rounding unless otherwise specified in the SolrRequestInfo -
Method Summary
Modifier and TypeMethodDescriptiongetNow()Returns a clone of this instance's concept of "now" (never null).static voidFor manual testing.Parses a date expression relative to "now".static LocalDateTimeparseMath(LocalDateTime now, String val) Parses a String which may be a date (in the standard ISO-8601 format) followed by an optional math expression.voidDefines this instance's concept of "now".
-
Field Details
-
UTC
-
DEFAULT_MATH_TZ
Default TimeZone for DateMath rounding (UTC) -
PARSER
Differs byDateTimeFormatter.ISO_INSTANTin that it's lenient.- See Also:
-
parseNoMath(String)
-
CALENDAR_UNITS
A mapping from (uppercased) String labels identifying time units, to the correspondingChronoUnitvalue (e.g. "YEARS") used to set/add/roll that unit of measurement.A single logical unit of time might be represented by multiple labels for convenience (i.e.
DATE==DAYS,MILLI==MILLIS)
-
-
Constructor Details
-
DateMathParser
public DateMathParser()Default constructor that assumes UTC should be used for rounding unless otherwise specified in the SolrRequestInfo -
DateMathParser
- Parameters:
tz- The TimeZone used for rounding (to determine when hours/days begin). If null, then this method defaults to the value dictated by the SolrRequestInfo if it exists -- otherwise it uses UTC.- See Also:
-
-
Method Details
-
parseMath
Parses a String which may be a date (in the standard ISO-8601 format) followed by an optional math expression.- Parameters:
now- an optional fixed date to use as "NOW"val- the string to parse- Returns:
- result of applying the parsed expression to "NOW".
- Throws:
Exception
-
getTimeZone
- Returns:
- the time zone
-
setNow
Defines this instance's concept of "now".- Parameters:
n- new value of "now".- See Also:
-
getNow
Returns a clone of this instance's concept of "now" (never null). If setNow was never called (or if null was specified) then this method first defines 'now' as the value dictated by the SolrRequestInfo if it exists -- otherwise it uses a new Date instance at the moment getNow() is first called.- Returns:
- "now".
- See Also:
-
parseMath
Parses a date expression relative to "now".- Parameters:
math- a date expression such as "+24MONTHS".- Returns:
- the result of applying the expression to the current time.
- Throws:
ParseException- positions in ParseExceptions are token positions, not character positions.
-
main
For manual testing. With one argument, test one-argument parseMath. With two (or more) arguments, test two-argument parseMath.- Parameters:
argv- date math expressions.- Throws:
Exception- passed through.
-