Class FastDateParser

java.lang.Object
org.sqlite.date.FastDateParser
All Implemented Interfaces:
Serializable, DateParser

public class FastDateParser extends Object implements DateParser, Serializable
FastDateParser is a fast and thread-safe version of SimpleDateFormat.

To obtain a proxy to a FastDateParser, use FastDateFormat.getInstance(String, TimeZone, Locale) or another variation of the factory methods of FastDateFormat.

Since FastDateParser is thread safe, you can use a static member instance: private static final DateParser DATE_PARSER = FastDateFormat.getInstance("yyyy-MM-dd");

This class can be used as a direct replacement for SimpleDateFormat in most parsing situations. This class is especially useful in multi-threaded server environments. SimpleDateFormat is not thread-safe in any JDK version, nor will it be as Sun has closed the bug/RFE.

Only parsing is supported by this class, but all patterns are compatible with SimpleDateFormat.

The class operates in lenient mode, so for example a time of 90 minutes is treated as 1 hour 30 minutes.

Timing tests indicate this class is as about as fast as SimpleDateFormat in single thread applications and about 25% faster in multi-thread applications.

Since:
3.2
Version:
$Id$
See Also:
  • Field Details

  • Constructor Details

    • FastDateParser

      protected FastDateParser(String pattern, TimeZone timeZone, Locale locale)
      Constructs a new FastDateParser. Use FastDateFormat.getInstance(String, TimeZone, Locale) or another variation of the factory methods of FastDateFormat to get a cached FastDateParser instance.
      Parameters:
      pattern - non-null SimpleDateFormat compatible pattern
      timeZone - non-null time zone to use
      locale - non-null locale
    • FastDateParser

      protected FastDateParser(String pattern, TimeZone timeZone, Locale locale, Date centuryStart)
      Constructs a new FastDateParser.
      Parameters:
      pattern - non-null SimpleDateFormat compatible pattern
      timeZone - non-null time zone to use
      locale - non-null locale
      centuryStart - The start of the century for 2 digit year parsing
      Since:
      3.3
  • Method Details

    • init

      private void init(Calendar definingCalendar)
      Initialize derived fields from defining fields. This is called from constructor and from readObject (de-serialization)
      Parameters:
      definingCalendar - the Calendar instance used to initialize this FastDateParser
    • getPattern

      public String getPattern()
      Description copied from interface: DateParser
      Get the pattern used by this parser.
      Specified by:
      getPattern in interface DateParser
      Returns:
      the pattern, SimpleDateFormat compatible
    • getTimeZone

      public TimeZone getTimeZone()
      Description copied from interface: DateParser
      Get the time zone used by this parser.

      The default TimeZone used to create a Date when the TimeZone is not specified by the format pattern.

      Specified by:
      getTimeZone in interface DateParser
      Returns:
      the time zone
    • getLocale

      public Locale getLocale()
      Description copied from interface: DateParser
      Get the locale used by this parser.
      Specified by:
      getLocale in interface DateParser
      Returns:
      the locale
    • getParsePattern

      Pattern getParsePattern()
      Returns the generated pattern (for testing purposes).
      Returns:
      the generated pattern
    • equals

      public boolean equals(Object obj)
      Compare another object for equality with this object.
      Overrides:
      equals in class Object
      Parameters:
      obj - the object to compare to
      Returns:
      trueif equal to this instance
    • hashCode

      public int hashCode()
      Return a hashcode compatible with equals.
      Overrides:
      hashCode in class Object
      Returns:
      a hashcode compatible with equals
    • toString

      public String toString()
      Get a string version of this formatter.
      Overrides:
      toString in class Object
      Returns:
      a debugging string
    • readObject

      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
      Create the object after serialization. This implementation reinitializes the transient properties.
      Parameters:
      in - ObjectInputStream from which the object is being deserialized.
      Throws:
      IOException - if there is an IO issue.
      ClassNotFoundException - if a class cannot be found.
    • parseObject

      public Object parseObject(String source) throws ParseException
      Description copied from interface: DateParser
      Parses text from a string to produce a Date.
      Specified by:
      parseObject in interface DateParser
      Parameters:
      source - A String whose beginning should be parsed.
      Returns:
      a java.util.Date object
      Throws:
      ParseException - if the beginning of the specified string cannot be parsed.
      See Also:
    • parse

      public Date parse(String source) throws ParseException
      Description copied from interface: DateParser
      Equivalent to DateFormat.parse(String).

      See DateFormat.parse(String) for more information.

      Specified by:
      parse in interface DateParser
      Parameters:
      source - A String whose beginning should be parsed.
      Returns:
      A Date parsed from the string
      Throws:
      ParseException - if the beginning of the specified string cannot be parsed.
    • parseObject

      public Object parseObject(String source, ParsePosition pos)
      Description copied from interface: DateParser
      Parse a date/time string according to the given parse position.
      Specified by:
      parseObject in interface DateParser
      Parameters:
      source - A String whose beginning should be parsed.
      pos - the parse position
      Returns:
      a java.util.Date object
      See Also:
    • parse

      public Date parse(String source, ParsePosition pos)
      This implementation updates the ParsePosition if the parse succeeds. However, unlike the method SimpleDateFormat.parse(String, ParsePosition) it is not able to set the error Index - i.e. ParsePosition.getErrorIndex() - if the parse fails.

      To determine if the parse has succeeded, the caller must check if the current parse position given by ParsePosition.getIndex() has been updated. If the input buffer has been fully parsed, then the index will point to just after the end of the input buffer.

      See org.apache.commons.lang3.time.DateParser#parse(java.lang.String, java.text.ParsePosition) Equivalent to DateFormat.parse(String, ParsePosition).

      See DateFormat.parse(String, ParsePosition) for more information.

      Specified by:
      parse in interface DateParser
      Parameters:
      source - A String, part of which should be parsed.
      pos - A ParsePosition object with index and error index information as described above.
      Returns:
      A Date parsed from the string. In case of error, returns null.
    • escapeRegex

      private static StringBuilder escapeRegex(StringBuilder regex, String value, boolean unquote)
      Escape constant fields into regular expression
      Parameters:
      regex - The destination regex
      value - The source field
      unquote - If true, replace two success quotes ('') with single quote (')
      Returns:
      The StringBuilder
    • getDisplayNames

      private static Map<String,Integer> getDisplayNames(int field, Calendar definingCalendar, Locale locale)
      Get the short and long values displayed for a field
      Parameters:
      field - The field of interest
      definingCalendar - The calendar to obtain the short and long values
      locale - The locale of display names
      Returns:
      A Map of the field key / value pairs
    • adjustYear

      private int adjustYear(int twoDigitYear)
      Adjust dates to be within appropriate century
      Parameters:
      twoDigitYear - The year to adjust
      Returns:
      A value between centuryStart(inclusive) to centuryStart+100(exclusive)
    • isNextNumber

      boolean isNextNumber()
      Is the next field a number?
      Returns:
      true, if next field will be a number
    • getFieldWidth

      int getFieldWidth()
      What is the width of the current field?
      Returns:
      The number of characters in the current format field
    • getStrategy

      private FastDateParser.Strategy getStrategy(String formatField, Calendar definingCalendar)
      Obtain a Strategy given a field from a SimpleDateFormat pattern
      Parameters:
      formatField - A sub-sequence of the SimpleDateFormat pattern
      definingCalendar - The calendar to obtain the short and long values
      Returns:
      The Strategy that will handle parsing for the field
    • getCache

      private static ConcurrentMap<Locale,FastDateParser.Strategy> getCache(int field)
      Get a cache of Strategies for a particular field
      Parameters:
      field - The Calendar field
      Returns:
      a cache of Locale to Strategy
    • getLocaleSpecificStrategy

      private FastDateParser.Strategy getLocaleSpecificStrategy(int field, Calendar definingCalendar)
      Construct a Strategy that parses a Text field
      Parameters:
      field - The Calendar field
      definingCalendar - The calendar to obtain the short and long values
      Returns:
      a TextStrategy for the field and Locale