Class DateTimeFormatter


  • public final class DateTimeFormatter
    extends java.lang.Object
    Formatter for printing and parsing date-time objects.

    This class provides the main application entry point for printing and parsing. Common instances of DateTimeFormatter are provided:

    • Using pattern letters, such as yyyy-MMM-dd
    • Using localized styles, such as long or medium
    • Using predefined constants, such as ISO_LOCAL_DATE

    For more complex formatters, a builder is provided.

    In most cases, it is not necessary to use this class directly when formatting. The main date-time classes provide two methods - one for formatting, format(DateTimeFormatter formatter), and one for parsing, For example:

      String text = date.format(formatter);
      LocalDate date = LocalDate.parse(text, formatter);
     
    Some aspects of printing and parsing are dependent on the locale. The locale can be changed using the withLocale(Locale) method which returns a new formatter in the requested locale.

    Some applications may need to use the older Format class for formatting. The toFormat() method returns an implementation of the old API.

    Specification for implementors

    This class is immutable and thread-safe.
    • Field Detail

      • ISO_LOCAL_DATE

        public static final DateTimeFormatter ISO_LOCAL_DATE
        Returns the ISO date formatter that prints/parses a date without an offset, such as '2011-12-03'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended local date format. The format consists of:

        • Four digits or more for the year. Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits. Years outside that range will have a prefixed positive or negative symbol.
        • A dash
        • Two digits for the month-of-year. This is pre-padded by zero to ensure two digits.
        • A dash
        • Two digits for the day-of-month. This is pre-padded by zero to ensure two digits.

      • ISO_OFFSET_DATE

        public static final DateTimeFormatter ISO_OFFSET_DATE
        Returns the ISO date formatter that prints/parses a date with an offset, such as '2011-12-03+01:00'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset date format. The format consists of:

        • The ISO_LOCAL_DATE
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

      • ISO_DATE

        public static final DateTimeFormatter ISO_DATE
        Returns the ISO date formatter that prints/parses a date with the offset if available, such as '2011-12-03' or '2011-12-03+01:00'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended date format. The format consists of:

        • The ISO_LOCAL_DATE
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • ISO_LOCAL_TIME

        public static final DateTimeFormatter ISO_LOCAL_TIME
        Returns the ISO time formatter that prints/parses a time without an offset, such as '10:15' or '10:15:30'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended local time format. The format consists of:

        • Two digits for the hour-of-day. This is pre-padded by zero to ensure two digits.
        • A colon
        • Two digits for the minute-of-hour. This is pre-padded by zero to ensure two digits.
        • If the second-of-minute is not available to print/parse then the format is complete.
        • A colon
        • Two digits for the second-of-minute. This is pre-padded by zero to ensure two digits.
        • If the nano-of-second is zero or not available to print/parse then the format is complete.
        • A decimal point
        • One to nine digits for the nano-of-second. As many digits will be printed as required.

      • ISO_OFFSET_TIME

        public static final DateTimeFormatter ISO_OFFSET_TIME
        Returns the ISO time formatter that prints/parses a time with an offset, such as '10:15+01:00' or '10:15:30+01:00'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset time format. The format consists of:

        • The ISO_LOCAL_TIME
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

      • ISO_TIME

        public static final DateTimeFormatter ISO_TIME
        Returns the ISO time formatter that prints/parses a time, with the offset if available, such as '10:15', '10:15:30' or '10:15:30+01:00'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset time format. The format consists of:

        • The ISO_LOCAL_TIME
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • ISO_LOCAL_DATE_TIME

        public static final DateTimeFormatter ISO_LOCAL_DATE_TIME
        Returns the ISO date formatter that prints/parses a date-time without an offset, such as '2011-12-03T10:15:30'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset date-time format. The format consists of:

      • ISO_OFFSET_DATE_TIME

        public static final DateTimeFormatter ISO_OFFSET_DATE_TIME
        Returns the ISO date formatter that prints/parses a date-time with an offset, such as '2011-12-03T10:15:30+01:00'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset date-time format. The format consists of:

        • The ISO_LOCAL_DATE_TIME
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

      • ISO_ZONED_DATE_TIME

        public static final DateTimeFormatter ISO_ZONED_DATE_TIME
        Returns the ISO date formatter that prints/parses a date-time with offset and zone, such as '2011-12-03T10:15:30+01:00[Europe/Paris]'.

        This returns an immutable formatter capable of printing and parsing a format that extends the ISO-8601 extended offset date-time format to add the time-zone. The format consists of:

        • The ISO_OFFSET_DATE_TIME
        • If the zone ID is not available or is a ZoneOffset then the format is complete.
        • An open square bracket '['.
        • The zone ID. This is not part of the ISO-8601 standard. Parsing is case sensitive.
        • A close square bracket ']'.

      • ISO_DATE_TIME

        public static final DateTimeFormatter ISO_DATE_TIME
        Returns the ISO date formatter that prints/parses a date-time with the offset and zone if available, such as '2011-12-03T10:15:30', '2011-12-03T10:15:30+01:00' or '2011-12-03T10:15:30+01:00[Europe/Paris]'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended offset date-time format. The format consists of:

        • The ISO_LOCAL_DATE_TIME
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard.
        • If the zone ID is not available or is a ZoneOffset then the format is complete.
        • An open square bracket '['.
        • The zone ID. This is not part of the ISO-8601 standard. Parsing is case sensitive.
        • A close square bracket ']'.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • ISO_ORDINAL_DATE

        public static final DateTimeFormatter ISO_ORDINAL_DATE
        Returns the ISO date formatter that prints/parses the ordinal date without an offset, such as '2012-337'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended ordinal date format. The format consists of:

        • Four digits or more for the year. Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits. Years outside that range will have a prefixed positive or negative symbol.
        • A dash
        • Three digits for the day-of-year. This is pre-padded by zero to ensure three digits.
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • ISO_WEEK_DATE

        public static final DateTimeFormatter ISO_WEEK_DATE
        Returns the ISO date formatter that prints/parses the week-based date without an offset, such as '2012-W48-6'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 extended week-based date format. The format consists of:

        • Four digits or more for the week-based-year. Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits. Years outside that range will have a prefixed positive or negative symbol.
        • A dash
        • The letter 'W'. Parsing is case insensitive.
        • Two digits for the week-of-week-based-year. This is pre-padded by zero to ensure three digits.
        • A dash
        • One digit for the day-of-week. The value run from Monday (1) to Sunday (7).
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • ISO_INSTANT

        public static final DateTimeFormatter ISO_INSTANT
        The ISO instant formatter that formats or parses an instant in UTC, such as '2011-12-03T10:15:30Z'.

        This returns an immutable formatter capable of formatting and parsing the ISO-8601 instant format. When formatting, the second-of-minute is always output. The nano-of-second outputs zero, three, six or nine digits as necessary. When parsing, time to at least the seconds field is required. Fractional seconds from zero to nine are parsed. The localized decimal style is not used.

        This is a special case formatter intended to allow a human readable form of an Instant. The Instant class is designed to only represent a point in time and internally stores a value in nanoseconds from a fixed epoch of 1970-01-01Z. As such, an Instant cannot be formatted as a date or time without providing some form of time-zone. This formatter allows the Instant to be formatted, by providing a suitable conversion using ZoneOffset.UTC.

        The format consists of:

        The returned formatter has no override chronology or zone. It uses the STRICT resolver style.

      • BASIC_ISO_DATE

        public static final DateTimeFormatter BASIC_ISO_DATE
        Returns the ISO date formatter that prints/parses a date without an offset, such as '20111203'.

        This returns an immutable formatter capable of printing and parsing the ISO-8601 basic local date format. The format consists of:

        • Four digits for the year. Only years in the range 0000 to 9999 are supported.
        • Two digits for the month-of-year. This is pre-padded by zero to ensure two digits.
        • Two digits for the day-of-month. This is pre-padded by zero to ensure two digits.
        • If the offset is not available to print/parse then the format is complete.
        • The offset ID without colons. If the offset has seconds then they will be handled even though this is not part of the ISO-8601 standard. Parsing is case insensitive.

        As this formatter has an optional element, it may be necessary to parse using parseBest(java.lang.CharSequence, org.threeten.bp.temporal.TemporalQuery<?>...).

      • RFC_1123_DATE_TIME

        public static final DateTimeFormatter RFC_1123_DATE_TIME
        Returns the RFC-1123 date-time formatter, such as 'Tue, 3 Jun 2008 11:05:30 GMT'.

        This returns an immutable formatter capable of printing and parsing most of the RFC-1123 format. RFC-1123 updates RFC-822 changing the year from two digits to four. This implementation requires a four digit year. This implementation also does not handle North American or military zone names, only 'GMT' and offset amounts.

        The format consists of:

        • If the day-of-week is not available to print/parse then jump to day-of-month.
        • Three letter day-of-week in English.
        • A comma
        • A space
        • One or two digits for the day-of-month.
        • A space
        • Three letter month-of-year in English.
        • A space
        • Four digits for the year. Only years in the range 0000 to 9999 are supported.
        • A space
        • Two digits for the hour-of-day. This is pre-padded by zero to ensure two digits.
        • A colon
        • Two digits for the minute-of-hour. This is pre-padded by zero to ensure two digits.
        • If the second-of-minute is not available to print/parse then jump to the next space.
        • A colon
        • Two digits for the second-of-minute. This is pre-padded by zero to ensure two digits.
        • A space
        • The offset ID without colons or seconds. An offset of zero uses "GMT". North American zone names and military zone names are not handled.

        Parsing is case insensitive.

    • Method Detail

      • ofPattern

        public static DateTimeFormatter ofPattern​(java.lang.String pattern)
        Creates a formatter using the specified pattern.

        This method will create a formatter based on a simple pattern of letters and symbols. For example, d MMM yyyy will format 2011-12-03 as '3 Dec 2011'.

        The returned formatter will use the default locale, but this can be changed using withLocale(Locale).

        All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. The following pattern letters are defined:

          Symbol  Meaning                     Presentation      Examples
          ------  -------                     ------------      -------
           G       era                         number/text       1; 01; AD; Anno Domini
           y       year                        year              2004; 04
           D       day-of-year                 number            189
           M       month-of-year               number/text       7; 07; Jul; July; J
           d       day-of-month                number            10
        
           Q       quarter-of-year             number/text       3; 03; Q3
           Y       week-based-year             year              1996; 96
           w       week-of-year                number            27
           W       week-of-month               number            27
           e       localized day-of-week       number            2; Tue; Tuesday; T
           E       day-of-week                 number/text       2; Tue; Tuesday; T
           F       week-of-month               number            3
        
           a       am-pm-of-day                text              PM
           h       clock-hour-of-am-pm (1-12)  number            12
           K       hour-of-am-pm (0-11)        number            0
           k       clock-hour-of-am-pm (1-24)  number            0
        
           H       hour-of-day (0-23)          number            0
           m       minute-of-hour              number            30
           s       second-of-minute            number            55
           S       fraction-of-second          fraction          978
           A       milli-of-day                number            1234
           n       nano-of-second              number            987654321
           N       nano-of-day                 number            1234000000
        
           V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
           z       time-zone name              zone-name         Pacific Standard Time; PST
           X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
           x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
           Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
        
           p       pad next                    pad modifier      1
        
           '       escape for text             delimiter
           ''      single quote                literal           '
           [       optional section start
           ]       optional section end
           {}      reserved for future use
         

        The count of pattern letters determine the format.

        Text: The text style is determined based on the number of pattern letters used. Less than 4 pattern letters will use the short form. Exactly 4 pattern letters will use the full form. Exactly 5 pattern letters will use the narrow form.

        Number: If the count of letters is one, then the value is printed using the minimum number of digits and without padding as per DateTimeFormatterBuilder.appendValue(TemporalField). Otherwise, the count of digits is used as the width of the output field as per DateTimeFormatterBuilder.appendValue(TemporalField, int).

        Number/Text: If the count of pattern letters is 3 or greater, use the Text rules above. Otherwise use the Number rules above.

        Fraction: Outputs the nano-of-second field as a fraction-of-second. The nano-of-second value has nine digits, thus the count of pattern letters is from 1 to 9. If it is less than 9, then the nano-of-second value is truncated, with only the most significant digits being output. When parsing in strict mode, the number of parsed digits must match the count of pattern letters. When parsing in lenient mode, the number of parsed digits must be at least the count of pattern letters, up to 9 digits.

        Year: The count of letters determines the minimum field width below which padding is used. If the count of letters is two, then a reduced two digit form is used. For printing, this outputs the rightmost two digits. For parsing, this will parse using the base value of 2000, resulting in a year within the range 2000 to 2099 inclusive. If the count of letters is less than four (but not two), then the sign is only output for negative years as per SignStyle.NORMAL. Otherwise, the sign is output if the pad width is exceeded, as per SignStyle.EXCEEDS_PAD

        ZoneId: This outputs the time-zone ID, such as 'Europe/Paris'. If the count of letters is two, then the time-zone ID is output. Any other count of letters throws IllegalArgumentException.

        Zone names: This outputs the display name of the time-zone ID. If the count of letters is one, two or three, then the short name is output. If the count of letters is four, then the full name is output. Five or more letters throws IllegalArgumentException.

        Offset X and x: This formats the offset based on the number of pattern letters. One letter outputs just the hour', such as '+01', unless the minute is non-zero in which case the minute is also output, such as '+0130'. Two letters outputs the hour and minute, without a colon, such as '+0130'. Three letters outputs the hour and minute, with a colon, such as '+01:30'. Four letters outputs the hour and minute and optional second, without a colon, such as '+013015'. Five letters outputs the hour and minute and optional second, with a colon, such as '+01:30:15'. Six or more letters throws IllegalArgumentException. Pattern letter 'X' (upper case) will output 'Z' when the offset to be output would be zero, whereas pattern letter 'x' (lower case) will output '+00', '+0000', or '+00:00'.

        Offset Z: This formats the offset based on the number of pattern letters. One, two or three letters outputs the hour and minute, without a colon, such as '+0130'. Four or more letters throws IllegalArgumentException. The output will be '+0000' when the offset is zero.

        Optional section: The optional section markers work exactly like calling DateTimeFormatterBuilder.optionalStart() and DateTimeFormatterBuilder.optionalEnd().

        Pad modifier: Modifies the pattern that immediately follows to be padded with spaces. The pad width is determined by the number of pattern letters. This is the same as calling DateTimeFormatterBuilder.padNext(int).

        For example, 'ppH' outputs the hour-of-day padded on the left with spaces to a width of 2.

        Any unrecognized letter is an error. Any non-letter character, other than '[', ']', '{', '}' and the single quote will be output directly. Despite this, it is recommended to use single quotes around all characters that you want to output directly to ensure that future changes do not break your application.

        Parameters:
        pattern - the pattern to use, not null
        Returns:
        the formatter based on the pattern, not null
        Throws:
        java.lang.IllegalArgumentException - if the pattern is invalid
        See Also:
        DateTimeFormatterBuilder.appendPattern(String)
      • ofPattern

        public static DateTimeFormatter ofPattern​(java.lang.String pattern,
                                                  java.util.Locale locale)
        Creates a formatter using the specified pattern.

        This method will create a formatter based on a simple pattern of letters and symbols. For example, d MMM yyyy will format 2011-12-03 as '3 Dec 2011'.

        See ofPattern(String) for details of the pattern.

        The returned formatter will use the specified locale, but this can be changed using withLocale(Locale).

        Parameters:
        pattern - the pattern to use, not null
        locale - the locale to use, not null
        Returns:
        the formatter based on the pattern, not null
        Throws:
        java.lang.IllegalArgumentException - if the pattern is invalid
        See Also:
        DateTimeFormatterBuilder.appendPattern(String)
      • ofLocalizedDate

        public static DateTimeFormatter ofLocalizedDate​(FormatStyle dateStyle)
        Returns a locale specific date format.

        This returns a formatter that will print/parse a date. The exact format pattern used varies by locale.

        The locale is determined from the formatter. The formatter returned directly by this method will use the default locale. The locale can be controlled using withLocale(Locale) on the result of this method.

        Note that the localized pattern is looked up lazily. This DateTimeFormatter holds the style required and the locale, looking up the pattern required on demand.

        Parameters:
        dateStyle - the formatter style to obtain, not null
        Returns:
        the date formatter, not null
      • ofLocalizedTime

        public static DateTimeFormatter ofLocalizedTime​(FormatStyle timeStyle)
        Returns a locale specific time format.

        This returns a formatter that will print/parse a time. The exact format pattern used varies by locale.

        The locale is determined from the formatter. The formatter returned directly by this method will use the default locale. The locale can be controlled using withLocale(Locale) on the result of this method.

        Note that the localized pattern is looked up lazily. This DateTimeFormatter holds the style required and the locale, looking up the pattern required on demand.

        Parameters:
        timeStyle - the formatter style to obtain, not null
        Returns:
        the time formatter, not null
      • ofLocalizedDateTime

        public static DateTimeFormatter ofLocalizedDateTime​(FormatStyle dateTimeStyle)
        Returns a locale specific date-time format, which is typically of short length.

        This returns a formatter that will print/parse a date-time. The exact format pattern used varies by locale.

        The locale is determined from the formatter. The formatter returned directly by this method will use the default locale. The locale can be controlled using withLocale(Locale) on the result of this method.

        Note that the localized pattern is looked up lazily. This DateTimeFormatter holds the style required and the locale, looking up the pattern required on demand.

        Parameters:
        dateTimeStyle - the formatter style to obtain, not null
        Returns:
        the date-time formatter, not null
      • ofLocalizedDateTime

        public static DateTimeFormatter ofLocalizedDateTime​(FormatStyle dateStyle,
                                                            FormatStyle timeStyle)
        Returns a locale specific date and time format.

        This returns a formatter that will print/parse a date-time. The exact format pattern used varies by locale.

        The locale is determined from the formatter. The formatter returned directly by this method will use the default locale. The locale can be controlled using withLocale(Locale) on the result of this method.

        Note that the localized pattern is looked up lazily. This DateTimeFormatter holds the style required and the locale, looking up the pattern required on demand.

        Parameters:
        dateStyle - the date formatter style to obtain, not null
        timeStyle - the time formatter style to obtain, not null
        Returns:
        the date, time or date-time formatter, not null
      • parsedExcessDays

        public static final TemporalQuery<Period> parsedExcessDays()
        A query that provides access to the excess days that were parsed.

        This returns a singleton query that provides access to additional information from the parse. The query always returns a non-null period, with a zero period returned instead of null.

        There are two situations where this query may return a non-zero period.

        • If the ResolverStyle is LENIENT and a time is parsed without a date, then the complete result of the parse consists of a LocalTime and an excess Period in days.
        • If the ResolverStyle is SMART and a time is parsed without a date where the time is 24:00:00, then the complete result of the parse consists of a LocalTime of 00:00:00 and an excess Period of one day.

        In both cases, if a complete ChronoLocalDateTime or Instant is parsed, then the excess days are added to the date part. As a result, this query will return a zero period.

        The SMART behaviour handles the common "end of day" 24:00 value. Processing in LENIENT mode also produces the same result:

          Text to parse        Parsed object                         Excess days
          "2012-12-03T00:00"   LocalDateTime.of(2012, 12, 3, 0, 0)   ZERO
          "2012-12-03T24:00"   LocalDateTime.of(2012, 12, 4, 0, 0)   ZERO
          "00:00"              LocalTime.of(0, 0)                    ZERO
          "24:00"              LocalTime.of(0, 0)                    Period.ofDays(1)
         
        The query can be used as follows:
          TemporalAccessor parsed = formatter.parse(str);
          LocalTime time = parsed.query(LocalTime.FROM);
          Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays());
         
        Returns:
        a query that provides access to the excess days that were parsed
      • parsedLeapSecond

        public static final TemporalQuery<java.lang.Boolean> parsedLeapSecond()
        A query that provides access to whether a leap-second was parsed.

        This returns a singleton query that provides access to additional information from the parse. The query always returns a non-null boolean, true if parsing saw a leap-second, false if not.

        Instant parsing handles the special "leap second" time of '23:59:60'. Leap seconds occur at '23:59:60' in the UTC time-zone, but at other local times in different time-zones. To avoid this potential ambiguity, the handling of leap-seconds is limited to DateTimeFormatterBuilder.appendInstant(), as that method always parses the instant with the UTC zone offset.

        If the time '23:59:60' is received, then a simple conversion is applied, replacing the second-of-minute of 60 with 59. This query can be used on the parse result to determine if the leap-second adjustment was made. The query will return one second of excess if it did adjust to remove the leap-second, and zero if not. Note that applying a leap-second smoothing mechanism, such as UTC-SLS, is the responsibility of the application, as follows:

          TemporalAccessor parsed = formatter.parse(str);
          Instant instant = parsed.query(Instant::from);
          if (parsed.query(DateTimeFormatter.parsedLeapSecond())) {
            // validate leap-second is correct and apply correct smoothing
          }
         
        Returns:
        a query that provides access to whether a leap-second was parsed
      • getLocale

        public java.util.Locale getLocale()
        Gets the locale to be used during formatting.

        This is used to lookup any part of the formatter needing specific localization, such as the text or localized pattern.

        Returns:
        the locale of this formatter, not null
      • withLocale

        public DateTimeFormatter withLocale​(java.util.Locale locale)
        Returns a copy of this formatter with a new locale.

        This is used to lookup any part of the formatter needing specific localization, such as the text or localized pattern.

        This instance is immutable and unaffected by this method call.

        Parameters:
        locale - the new locale, not null
        Returns:
        a formatter based on this formatter with the requested locale, not null
      • getDecimalStyle

        public DecimalStyle getDecimalStyle()
        Gets the decimal style to be used during formatting.
        Returns:
        the decimal style of this formatter, not null
      • withDecimalStyle

        public DateTimeFormatter withDecimalStyle​(DecimalStyle decimalStyle)
        Returns a copy of this formatter with a new decimal style.

        This instance is immutable and unaffected by this method call.

        Parameters:
        decimalStyle - the new decimal style, not null
        Returns:
        a formatter based on this formatter with the requested symbols, not null
      • getChronology

        public Chronology getChronology()
        Gets the overriding chronology to be used during formatting.

        This returns the override chronology, used to convert dates. By default, a formatter has no override chronology, returning null. See withChronology(Chronology) for more details on overriding.

        Returns:
        the chronology of this formatter, null if no override
      • withChronology

        public DateTimeFormatter withChronology​(Chronology chrono)
        Returns a copy of this formatter with a new override chronology.

        This returns a formatter with similar state to this formatter but with the override chronology set. By default, a formatter has no override chronology, returning null.

        If an override is added, then any date that is printed or parsed will be affected.

        When printing, if the Temporal object contains a date then it will be converted to a date in the override chronology. Any time or zone will be retained unless overridden. The converted result will behave in a manner equivalent to an implementation of ChronoLocalDate,ChronoLocalDateTime or ChronoZonedDateTime.

        When parsing, the override chronology will be used to interpret the fields into a date unless the formatter directly parses a valid chronology.

        This instance is immutable and unaffected by this method call.

        Parameters:
        chrono - the new chronology, not null
        Returns:
        a formatter based on this formatter with the requested override chronology, not null
      • getZone

        public ZoneId getZone()
        Gets the overriding zone to be used during formatting.

        This returns the override zone, used to convert instants. By default, a formatter has no override zone, returning null. See withZone(ZoneId) for more details on overriding.

        Returns:
        the chronology of this formatter, null if no override
      • withZone

        public DateTimeFormatter withZone​(ZoneId zone)
        Returns a copy of this formatter with a new override zone.

        This returns a formatter with similar state to this formatter but with the override zone set. By default, a formatter has no override zone, returning null.

        If an override is added, then any instant that is printed or parsed will be affected.

        When printing, if the Temporal object contains an instant then it will be converted to a zoned date-time using the override zone. If the input has a chronology then it will be retained unless overridden. If the input does not have a chronology, such as Instant, then the ISO chronology will be used. The converted result will behave in a manner equivalent to an implementation of ChronoZonedDateTime.

        When parsing, the override zone will be used to interpret the fields into an instant unless the formatter directly parses a valid zone.

        This instance is immutable and unaffected by this method call.

        Parameters:
        zone - the new override zone, not null
        Returns:
        a formatter based on this formatter with the requested override zone, not null
      • getResolverStyle

        public ResolverStyle getResolverStyle()
        Gets the resolver style to use during parsing.

        This returns the resolver style, used during the second phase of parsing when fields are resolved into dates and times. By default, a formatter has the SMART resolver style. See withResolverStyle(ResolverStyle) for more details.

        Returns:
        the resolver style of this formatter, not null
      • withResolverStyle

        public DateTimeFormatter withResolverStyle​(ResolverStyle resolverStyle)
        Returns a copy of this formatter with a new resolver style.

        This returns a formatter with similar state to this formatter but with the resolver style set. By default, a formatter has the SMART resolver style.

        Changing the resolver style only has an effect during parsing. Parsing a text string occurs in two phases. Phase 1 is a basic text parse according to the fields added to the builder. Phase 2 resolves the parsed field-value pairs into date and/or time objects. The resolver style is used to control how phase 2, resolving, happens. See ResolverStyle for more information on the options available.

        This instance is immutable and unaffected by this method call.

        Parameters:
        resolverStyle - the new resolver style, not null
        Returns:
        a formatter based on this formatter with the requested resolver style, not null
      • getResolverFields

        public java.util.Set<TemporalField> getResolverFields()
        Gets the resolver fields to use during parsing.

        This returns the resolver fields, used during the second phase of parsing when fields are resolved into dates and times. By default, a formatter has no resolver fields, and thus returns null. See withResolverFields(Set) for more details.

        Returns:
        the immutable set of resolver fields of this formatter, null if no fields
      • withResolverFields

        public DateTimeFormatter withResolverFields​(TemporalField... resolverFields)
        Returns a copy of this formatter with a new set of resolver fields.

        This returns a formatter with similar state to this formatter but with the resolver fields set. By default, a formatter has no resolver fields.

        Changing the resolver fields only has an effect during parsing. Parsing a text string occurs in two phases. Phase 1 is a basic text parse according to the fields added to the builder. Phase 2 resolves the parsed field-value pairs into date and/or time objects. The resolver fields are used to filter the field-value pairs between phase 1 and 2.

        This can be used to select between two or more ways that a date or time might be resolved. For example, if the formatter consists of year, month, day-of-month and day-of-year, then there are two ways to resolve a date. Calling this method with the arguments YEAR and DAY_OF_YEAR will ensure that the date is resolved using the year and day-of-year, effectively meaning that the month and day-of-month are ignored during the resolving phase.

        In a similar manner, this method can be used to ignore secondary fields that would otherwise be cross-checked. For example, if the formatter consists of year, month, day-of-month and day-of-week, then there is only one way to resolve a date, but the parsed value for day-of-week will be cross-checked against the resolved date. Calling this method with the arguments YEAR, MONTH_OF_YEAR and DAY_OF_MONTH will ensure that the date is resolved correctly, but without any cross-check for the day-of-week.

        In implementation terms, this method behaves as follows. The result of the parsing phase can be considered to be a map of field to value. The behavior of this method is to cause that map to be filtered between phase 1 and 2, removing all fields other than those specified as arguments to this method.

        This instance is immutable and unaffected by this method call.

        Parameters:
        resolverFields - the new set of resolver fields, null if no fields
        Returns:
        a formatter based on this formatter with the requested resolver style, not null
      • withResolverFields

        public DateTimeFormatter withResolverFields​(java.util.Set<TemporalField> resolverFields)
        Returns a copy of this formatter with a new set of resolver fields.

        This returns a formatter with similar state to this formatter but with the resolver fields set. By default, a formatter has no resolver fields.

        Changing the resolver fields only has an effect during parsing. Parsing a text string occurs in two phases. Phase 1 is a basic text parse according to the fields added to the builder. Phase 2 resolves the parsed field-value pairs into date and/or time objects. The resolver fields are used to filter the field-value pairs between phase 1 and 2.

        This can be used to select between two or more ways that a date or time might be resolved. For example, if the formatter consists of year, month, day-of-month and day-of-year, then there are two ways to resolve a date. Calling this method with the arguments YEAR and DAY_OF_YEAR will ensure that the date is resolved using the year and day-of-year, effectively meaning that the month and day-of-month are ignored during the resolving phase.

        In a similar manner, this method can be used to ignore secondary fields that would otherwise be cross-checked. For example, if the formatter consists of year, month, day-of-month and day-of-week, then there is only one way to resolve a date, but the parsed value for day-of-week will be cross-checked against the resolved date. Calling this method with the arguments YEAR, MONTH_OF_YEAR and DAY_OF_MONTH will ensure that the date is resolved correctly, but without any cross-check for the day-of-week.

        In implementation terms, this method behaves as follows. The result of the parsing phase can be considered to be a map of field to value. The behavior of this method is to cause that map to be filtered between phase 1 and 2, removing all fields other than those specified as arguments to this method.

        This instance is immutable and unaffected by this method call.

        Parameters:
        resolverFields - the new set of resolver fields, null if no fields
        Returns:
        a formatter based on this formatter with the requested resolver style, not null
      • format

        public java.lang.String format​(TemporalAccessor temporal)
        Formats a date-time object using this formatter.

        This formats the date-time to a String using the rules of the formatter.

        Parameters:
        temporal - the temporal object to print, not null
        Returns:
        the printed string, not null
        Throws:
        DateTimeException - if an error occurs during formatting
      • formatTo

        public void formatTo​(TemporalAccessor temporal,
                             java.lang.Appendable appendable)
        Formats a date-time object to an Appendable using this formatter.

        This formats the date-time to the specified destination. Appendable is a general purpose interface that is implemented by all key character output classes including StringBuffer, StringBuilder, PrintStream and Writer.

        Although Appendable methods throw an IOException, this method does not. Instead, any IOException is wrapped in a runtime exception.

        Parameters:
        temporal - the temporal object to print, not null
        appendable - the appendable to print to, not null
        Throws:
        DateTimeException - if an error occurs during formatting
      • parse

        public TemporalAccessor parse​(java.lang.CharSequence text)
        Fully parses the text producing a temporal object.

        This parses the entire text producing a temporal object. It is typically more useful to use parse(CharSequence, TemporalQuery). The result of this method is TemporalAccessor which has been resolved, applying basic validation checks to help ensure a valid date-time.

        If the parse completes without reading the entire length of the text, or a problem occurs during parsing or merging, then an exception is thrown.

        Parameters:
        text - the text to parse, not null
        Returns:
        the parsed temporal object, not null
        Throws:
        DateTimeParseException - if unable to parse the requested result
      • parse

        public TemporalAccessor parse​(java.lang.CharSequence text,
                                      java.text.ParsePosition position)
        Parses the text using this formatter, providing control over the text position.

        This parses the text without requiring the parse to start from the beginning of the string or finish at the end. The result of this method is TemporalAccessor which has been resolved, applying basic validation checks to help ensure a valid date-time.

        The text will be parsed from the specified start ParsePosition. The entire length of the text does not have to be parsed, the ParsePosition will be updated with the index at the end of parsing.

        The operation of this method is slightly different to similar methods using ParsePosition on java.text.Format. That class will return errors using the error index on the ParsePosition. By contrast, this method will throw a DateTimeParseException if an error occurs, with the exception containing the error index. This change in behavior is necessary due to the increased complexity of parsing and resolving dates/times in this API.

        If the formatter parses the same field more than once with different values, the result will be an error.

        Parameters:
        text - the text to parse, not null
        position - the position to parse from, updated with length parsed and the index of any error, not null
        Returns:
        the parsed temporal object, not null
        Throws:
        DateTimeParseException - if unable to parse the requested result
        java.lang.IndexOutOfBoundsException - if the position is invalid
      • parse

        public <T> T parse​(java.lang.CharSequence text,
                           TemporalQuery<T> type)
        Fully parses the text producing an object of the specified type.

        Most applications should use this method for parsing. It parses the entire text to produce the required date-time. For example:

          LocalDateTime dt = parser.parse(str, LocalDateTime.FROM);
         
        If the parse completes without reading the entire length of the text, or a problem occurs during parsing or merging, then an exception is thrown.
        Type Parameters:
        T - the type to extract
        Parameters:
        text - the text to parse, not null
        type - the type to extract, not null
        Returns:
        the parsed date-time, not null
        Throws:
        DateTimeParseException - if unable to parse the requested result
      • parseBest

        public TemporalAccessor parseBest​(java.lang.CharSequence text,
                                          TemporalQuery<?>... types)
        Fully parses the text producing an object of one of the specified types.

        This parse method is convenient for use when the parser can handle optional elements. For example, a pattern of 'yyyy[-MM[-dd]]' can be fully parsed to a LocalDate, or partially parsed to a YearMonth or a Year. The types must be specified in order, starting from the best matching full-parse option and ending with the worst matching minimal parse option.

        The result is associated with the first type that successfully parses. Normally, applications will use instanceof to check the result. For example:

          TemporalAccessor dt = parser.parseBest(str, LocalDate.FROM, YearMonth.FROM);
          if (dt instanceof LocalDate) {
           ...
          } else {
           ...
          }
         
        If the parse completes without reading the entire length of the text, or a problem occurs during parsing or merging, then an exception is thrown.
        Parameters:
        text - the text to parse, not null
        types - the types to attempt to parse to, which must implement TemporalAccessor, not null
        Returns:
        the parsed date-time, not null
        Throws:
        java.lang.IllegalArgumentException - if less than 2 types are specified
        DateTimeParseException - if unable to parse the requested result
      • parseUnresolved

        public TemporalAccessor parseUnresolved​(java.lang.CharSequence text,
                                                java.text.ParsePosition position)
        Parses the text using this formatter, without resolving the result, intended for advanced use cases.

        Parsing is implemented as a two-phase operation. First, the text is parsed using the layout defined by the formatter, producing a Map of field to value, a ZoneId and a Chronology. Second, the parsed data is resolved, by validating, combining and simplifying the various fields into more useful ones. This method performs the parsing stage but not the resolving stage.

        The result of this method is TemporalAccessor which represents the data as seen in the input. Values are not validated, thus parsing a date string of '2012-00-65' would result in a temporal with three fields - year of '2012', month of '0' and day-of-month of '65'.

        The text will be parsed from the specified start ParsePosition. The entire length of the text does not have to be parsed, the ParsePosition will be updated with the index at the end of parsing.

        Errors are returned using the error index field of the ParsePosition instead of DateTimeParseException. The returned error index will be set to an index indicative of the error. Callers must check for errors before using the context.

        If the formatter parses the same field more than once with different values, the result will be an error.

        This method is intended for advanced use cases that need access to the internal state during parsing. Typical application code should use parse(CharSequence, TemporalQuery) or the parse method on the target type.

        Parameters:
        text - the text to parse, not null
        position - the position to parse from, updated with length parsed and the index of any error, not null
        Returns:
        the parsed text, null if the parse results in an error
        Throws:
        DateTimeException - if some problem occurs during parsing
        java.lang.IndexOutOfBoundsException - if the position is invalid
      • toFormat

        public java.text.Format toFormat()
        Returns this formatter as a java.text.Format instance.

        The returned Format instance will print any TemporalAccessor and parses to a resolved TemporalAccessor.

        Exceptions will follow the definitions of Format, see those methods for details about IllegalArgumentException during formatting and ParseException or null during parsing. The format does not support attributing of the returned format string.

        Returns:
        this formatter as a classic format instance, not null
      • toFormat

        public java.text.Format toFormat​(TemporalQuery<?> query)
        Returns this formatter as a java.text.Format instance that will parse to the specified type.

        The returned Format instance will print any TemporalAccessor and parses to the type specified. The type must be one that is supported by parse(java.lang.CharSequence).

        Exceptions will follow the definitions of Format, see those methods for details about IllegalArgumentException during formatting and ParseException or null during parsing. The format does not support attributing of the returned format string.

        Parameters:
        query - the query to parse to, not null
        Returns:
        this formatter as a classic format instance, not null
      • toString

        public java.lang.String toString()
        Returns a description of the underlying formatters.
        Overrides:
        toString in class java.lang.Object
        Returns:
        a description of this formatter, not null