This class provides the main application entry point for printing and parsing
and provides common implementations of DateTimeFormatter
:
ISO_LOCAL_DATE
uuuu-MMM-dd
long
or medium
More complex formatters are provided by
DateTimeFormatterBuilder
.
The main date-time classes provide two methods - one for formatting,
format(DateTimeFormatter formatter)
, and one for parsing,
parse(CharSequence text, DateTimeFormatter formatter)
.
For example:
LocalDate date = LocalDate.now(); String text = date.format(formatter); LocalDate parsedDate = LocalDate.parse(text, formatter);
In addition to the format, formatters can be created with desired Locale, Chronology, ZoneId, and DecimalStyle.
The withLocale
method returns a new formatter that
overrides the locale. The locale affects some aspects of formatting and
parsing. For example, the ofLocalizedDate
provides a
formatter that uses the locale specific date format.
The withChronology
method returns a new formatter
that overrides the chronology. If overridden, the date-time value is
converted to the chronology before formatting. During parsing the date-time
value is converted to the chronology before it is returned.
The withZone
method returns a new formatter that overrides
the zone. If overridden, the date-time value is converted to a ZonedDateTime
with the requested ZoneId before formatting. During parsing the ZoneId is
applied before the value is returned.
The withDecimalStyle
method returns a new formatter that
overrides the DecimalStyle
. The DecimalStyle symbols are used for
formatting and parsing.
Some applications may need to use the older java.
class for formatting. The toFormat()
method returns an
implementation of java.text.Format
.
Formatter | Description | Example |
---|---|---|
ofLocalizedDate(dateStyle) |
Formatter with date style from the locale | '2011-12-03' |
ofLocalizedTime(timeStyle) |
Formatter with time style from the locale | '10:15:30' |
ofLocalizedDateTime(dateTimeStyle) |
Formatter with a style for date and time from the locale | '3 Jun 2008 11:05:30' |
ofLocalizedDateTime(dateStyle,timeStyle)
|
Formatter with date and time styles from the locale | '3 Jun 2008 11:05' |
BASIC_ISO_DATE |
Basic ISO date | '20111203' |
ISO_LOCAL_DATE |
ISO Local Date | '2011-12-03' |
ISO_OFFSET_DATE |
ISO Date with offset | '2011-12-03+01:00' |
ISO_DATE |
ISO Date with or without offset | '2011-12-03+01:00'; '2011-12-03' |
ISO_LOCAL_TIME |
Time without offset | '10:15:30' |
ISO_OFFSET_TIME |
Time with offset | '10:15:30+01:00' |
ISO_TIME |
Time with or without offset | '10:15:30+01:00'; '10:15:30' |
ISO_LOCAL_DATE_TIME |
ISO Local Date and Time | '2011-12-03T10:15:30' |
ISO_OFFSET_DATE_TIME |
Date Time with Offset | '2011-12-03T10:15:30+01:00' |
ISO_ZONED_DATE_TIME |
Zoned Date Time | '2011-12-03T10:15:30+01:00[Europe/Paris]' |
ISO_DATE_TIME |
Date and time with ZoneId | '2011-12-03T10:15:30+01:00[Europe/Paris]' |
ISO_ORDINAL_DATE |
Year and day of year | '2012-337' |
ISO_WEEK_DATE |
Year and Week | '2012-W48-6' |
ISO_INSTANT |
Date and Time of an Instant | '2011-12-03T10:15:30Z' |
RFC_1123_DATE_TIME |
RFC 1123 / RFC 822 | 'Tue, 3 Jun 2008 11:05:30 GMT' |
ofPattern(String)
and ofPattern(String, Locale)
methods.
For example,
"d MMM uuuu"
will format 2011-12-03 as '3 Dec 2011'.
A formatter created from a pattern can be used as many times as necessary,
it is immutable and is thread-safe.
For example:
LocalDate date = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd"); String text = date.format(formatter); LocalDate parsedDate = LocalDate.parse(text, formatter);
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 | text | AD; Anno Domini; A |
u | year | year | 2004; 04 |
y | year-of-era | year | 2004; 04 |
D | day-of-year | number | 189 |
M/L | month-of-year | number/text | 7; 07; Jul; July; J |
d | day-of-month | number | 10 |
g | modified-julian-day | number | 2451334 |
Q/q | quarter-of-year | number/text | 3; 03; Q3; 3rd quarter |
Y | week-based-year | year | 1996; 96 |
w | week-of-week-based-year | number | 27 |
W | week-of-month | number | 4 |
E | day-of-week | text | Tue; Tuesday; T |
e/c | localized day-of-week | number/text | 2; 02; Tue; Tuesday; T |
F | aligned-week-of-month | number | 3 |
a | am-pm-of-day | text | PM |
B | period-of-day | text | in the morning |
h | clock-hour-of-am-pm (1-12) | number | 12 |
K | hour-of-am-pm (0-11) | number | 0 |
k | clock-hour-of-day (1-24) | number | 24 |
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 |
v | generic time-zone name | zone-name | Pacific Time; PT |
z | time-zone name | zone-name | Pacific Standard Time; PST |
O | localized zone-offset | offset-O | GMT+8; GMT+08:00; UTC-08:00 |
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 | ||
{ | reserved for future use | ||
} | reserved for future use |
The count of pattern letters determines 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
.
Pattern letters 'L', 'c', and 'q' specify the stand-alone form of the text styles.
Number: If the count of letters is one, then the value is output using the minimum number of digits and without padding. Otherwise, the count of digits is used as the width of the output field, with the value zero-padded as necessary. The following pattern letters have constraints on the count of letters. Only one letter of 'c' and 'F' can be specified. Up to two letters of 'd', 'H', 'h', 'K', 'k', 'm', and 's' can be specified. Up to three letters of 'D' can be specified.
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.
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
pattern letter is 'z' the output is the daylight saving aware zone name.
If there is insufficient information to determine whether DST applies,
the name ignoring daylight saving time will be used.
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
.
If the pattern letter is 'v' the output provides the zone name ignoring
daylight saving time. If the count of letters is one, then the short name is output.
If the count of letters is four, then the full name is output.
Two, three and five or more letters throw 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 O: With a non-zero offset, this formats the localized offset
based on the number of pattern letters. One letter outputs the
short form of the localized offset, which is
localized offset text, such as 'GMT', with hour without leading zero, optional
2-digit minute and second if non-zero, and colon, for example 'GMT+8'. Four
letters outputs the full form, which is localized
offset text, such as 'GMT, with 2-digit hour and minute field, optional second
field if non-zero, and colon, for example 'GMT+08:00'. If the offset is zero,
only localized text is output. Any other count of letters throws
IllegalArgumentException
.
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'. The output will be '+0000' when the offset is zero.
Four letters outputs the full form of localized
offset, equivalent to four letters of Offset-O. The output will be the
corresponding localized offset text if the offset is zero. Five
letters outputs the hour, minute, with optional second if non-zero, with
colon. It outputs 'Z' if the offset is zero.
Six or more letters throws IllegalArgumentException
.
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.
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.
Five parsing methods are supplied by this class.
Four of these perform both the parse and resolve phases.
The fifth method, parseUnresolved(CharSequence, ParsePosition)
,
only performs the first phase, leaving the result unresolved.
As such, it is essentially a low-level operation.
The resolve phase is controlled by two parameters, set on this class.
The ResolverStyle
is an enum that offers three different approaches,
strict, smart and lenient. The smart option is the default.
It can be set using withResolverStyle(ResolverStyle)
.
The withResolverFields(TemporalField.
parameter allows the
set of fields that will be resolved to be filtered before resolving starts.
For example, if the formatter has parsed a year, month, day-of-month
and day-of-year, then there are two approaches to resolve a date:
(year + month + day-of-month) and (year + day-of-year).
The resolver fields allows one of the two approaches to be selected.
If no resolver fields are set then both approaches must result in the same date.
Resolving separate fields to form a complete date and time is a complex process with behaviour distributed across a number of classes. It follows these steps:
IsoChronology
.
ChronoField
date fields are resolved.
This is achieved using Chronology#resolveDate(Map, ResolverStyle)
.
Documentation about field resolution is located in the implementation
of Chronology
.
ChronoField
time fields are resolved.
This is documented on ChronoField
and is the same for all chronologies.
ChronoField
are processed.
This is achieved using TemporalField#resolve(Map, TemporalAccessor, ResolverStyle)
.
Documentation about field resolution is located in the implementation
of TemporalField
.
ChronoField
date and time fields are re-resolved.
This allows fields in step four to produce ChronoField
values
and have them be processed into dates and times.
LocalTime
is formed if there is at least an hour-of-day available.
This involves providing default values for minute, second and fraction of second.
LocalTime
was not parsed,
then the resolver ensures that milli, micro and nano second values are
available to meet the contract of ChronoField
.
These will be set to zero if missing.
ChronoField#INSTANT_SECONDS
is created.
If an offset was parsed then the offset will be combined with the
LocalDateTime
to form the instant, with any zone ignored.
If a ZoneId
was parsed without an offset then the zone will be
combined with the LocalDateTime
to form the instant using the rules
of ChronoLocalDateTime#atZone(ZoneId)
. If the ZoneId
was
parsed from a zone name that indicates whether daylight saving time is in
operation or not, then that fact will be used to select the correct offset
at the local time-line overlap.
Implementation Specification
This class is immutable and thread-safe.
Modifier and Type | Class and Description |
---|---|
pack-priv static class | DateTimeFormatter.
Implements the classic Java Format API. |
Modifier and Type | Field and Description |
---|---|
public static final DateTimeFormatter | BASIC_ISO_DATE
The ISO date formatter that formats or parses a date without an offset, such as '20111203'. |
private final Chronology | chrono
The chronology to use for formatting, null for no override. |
private final DecimalStyle | decimalStyle
The symbols to use for formatting, not null. |
public static final DateTimeFormatter | ISO_DATE
The ISO date formatter that formats or parses a date with the offset if available, such as '2011-12-03' or '2011-12-03+01:00'. |
public static final DateTimeFormatter | ISO_DATE_TIME
The ISO-like date-time formatter that formats or 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]'. |
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'. |
public static final DateTimeFormatter | ISO_LOCAL_DATE
The ISO date formatter that formats or parses a date without an offset, such as '2011-12-03'. |
public static final DateTimeFormatter | ISO_LOCAL_DATE_TIME
The ISO date-time formatter that formats or parses a date-time without an offset, such as '2011-12-03T10:15:30'. |
public static final DateTimeFormatter | ISO_LOCAL_TIME
The ISO time formatter that formats or parses a time without an offset, such as '10:15' or '10:15:30'. |
public static final DateTimeFormatter | ISO_OFFSET_DATE
The ISO date formatter that formats or parses a date with an offset, such as '2011-12-03+01:00'. |
public static final DateTimeFormatter | ISO_OFFSET_DATE_TIME
The ISO date-time formatter that formats or parses a date-time with an offset, such as '2011-12-03T10:15:30+01:00'. |
public static final DateTimeFormatter | ISO_OFFSET_TIME
The ISO time formatter that formats or parses a time with an offset, such as '10:15+01:00' or '10:15:30+01:00'. |
public static final DateTimeFormatter | ISO_ORDINAL_DATE
The ISO date formatter that formats or parses the ordinal date without an offset, such as '2012-337'. |
public static final DateTimeFormatter | ISO_TIME
The ISO time formatter that formats or parses a time, with the offset if available, such as '10:15', '10:15:30' or '10:15:30+01:00'. |
public static final DateTimeFormatter | ISO_WEEK_DATE
The ISO date formatter that formats or parses the week-based date without an offset, such as '2012-W48-6'. |
public static final DateTimeFormatter | ISO_ZONED_DATE_TIME
The ISO-like date-time formatter that formats or parses a date-time with offset and zone, such as '2011-12-03T10:15:30+01:00[Europe/Paris]'. |
private final Locale | locale
The locale to use for formatting, not null. |
private static final TemporalQuery | |
private static final TemporalQuery | |
private final DateTimeFormatterBuilder. | printerParser
The printer and/or parser to use, not null. |
private final Set | resolverFields
The fields to use in resolving, null for all fields. |
private final ResolverStyle | resolverStyle
The resolver style to use, not null. |
public static final DateTimeFormatter | RFC_1123_DATE_TIME
The RFC-1123 date-time formatter, such as 'Tue, 3 Jun 2008 11:05:30 GMT'. |
private final ZoneId | zone
The zone to use for formatting, null for no override. |
Access | Constructor and Description |
---|---|
pack-priv | DateTimeFormatter(DateTimeFormatterBuilder.
the printer/parser to use, not null printerParser,the locale to use, not null locale, DecimalStyle the DecimalStyle to use, not null decimalStyle, ResolverStyle the resolver style to use, not null resolverStyle, Set<TemporalField> the fields to use during resolving, null for all fields resolverFields, Chronology the chronology to use, null for no override chrono, ZoneId the zone to use, null for no override zone)Constructor. |
Modifier and Type | Method and Description |
---|---|
private DateTimeParseException | |
public String | Returns: the formatted string, not nullthe temporal object to format, not null temporal)Formats a date-time object using this formatter. |
public void | formatTo(TemporalAccessor
the temporal object to format, not null temporal, Appendable the appendable to format to, not null appendable)Formats a date-time object to an |
public Chronology | Returns: the override chronology of this formatter, null if no overrideGets the overriding chronology to be used during formatting. |
public DecimalStyle | Returns: the DecimalStyle of this formatter, not nullGets the DecimalStyle to be used during formatting. |
public Locale | Returns: the locale of this formatter, not nullGets the locale to be used during formatting. |
public Set | Returns: the immutable set of resolver fields of this formatter, null if no fieldsGets the resolver fields to use during parsing. |
public ResolverStyle | Returns: the resolver style of this formatter, not nullGets the resolver style to use during parsing. |
public ZoneId | Returns: the override zone of this formatter, null if no overrideGets the overriding zone to be used during formatting. |
public DateTimeFormatter | Returns: a formatter based on this formatter with localized values of the calendar, decimal style and/or timezone, that supersede values in this formatter.the locale, not null locale)Returns a copy of this formatter with localized values of the locale, calendar, region, decimal style and/or timezone, that supersede values in this formatter. |
public static DateTimeFormatter | Returns: the date formatter, not nullthe formatter style to obtain, not null dateStyle)Returns a locale specific date format for the ISO chronology. |
public static DateTimeFormatter | Returns: the date-time formatter, not nullthe formatter style to obtain, not null dateTimeStyle)Returns a locale specific date-time formatter for the ISO chronology. |
public static DateTimeFormatter | Returns: the date, time or date-time formatter, not nullthe date formatter style to obtain, not null dateStyle, FormatStyle the time formatter style to obtain, not null timeStyle)Returns a locale specific date and time format for the ISO chronology. |
public static DateTimeFormatter | Returns: the formatter based on therequestedTemplate pattern, not nullthe requested template, not null requestedTemplate)Creates a locale specific formatter derived from the requested template for the ISO chronology. |
public static DateTimeFormatter | Returns: the time formatter, not nullthe formatter style to obtain, not null timeStyle)Returns a locale specific time format for the ISO chronology. |
public static DateTimeFormatter | |
public static DateTimeFormatter | |
public TemporalAccessor | Returns: the parsed temporal object, not nullthe text to parse, not null text)Fully parses the text producing a temporal object. |
public TemporalAccessor | Returns: the parsed temporal object, not nullthe text to parse, not null text, ParsePosition the position to parse from, updated with length parsed
and the index of any error, not null position)Parses the text using this formatter, providing control over the text position. |
public < the type of the parsed date-time T> T | Returns: the parsed date-time, not nullthe text to parse, not null text, TemporalQuery<T> the query defining the type to parse to, not null query)Fully parses the text producing an object of the specified type. |
public TemporalAccessor | Returns: the parsed date-time, not nullthe text to parse, not null text, TemporalQuery<?>... the queries defining the types to attempt to parse to,
must implement queries)TemporalAccessor , not nullFully parses the text producing an object of one of the specified types. |
public static final TemporalQuery | Returns: a query that provides access to the excess days that were parsedA query that provides access to the excess days that were parsed. |
public static final TemporalQuery | Returns: a query that provides access to whether a leap-second was parsedA query that provides access to whether a leap-second was parsed. |
private TemporalAccessor | Returns: the resolved result of the parse, not nullthe text to parse, not null text, final ParsePosition the position to parse from, updated with length parsed
and the index of any error, null if parsing whole string position)Parses and resolves the specified text. |
public TemporalAccessor | Returns: the parsed text, null if the parse results in an errorthe text to parse, not null text, ParsePosition the position to parse from, updated with length parsed
and the index of any error, not null position)Parses the text using this formatter, without resolving the result, intended for advanced use cases. |
private DateTimeParseContext | |
public Format | Returns: this formatter as a classic format instance, not nullReturns this formatter as a |
public Format | Returns: this formatter as a classic format instance, not nullthe query defining the type to parse to, not null parseQuery)Returns this formatter as a |
pack-priv DateTimeFormatterBuilder. | Returns: the printer/parser, not nullwhether the printer/parser should be optional optional)Returns the formatter as a composite printer parser. |
public String | Returns: a description of this formatter, not nullOverrides java. Returns a description of the underlying formatters. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested override chronology, not nullthe new chronology, null if no override chrono)Returns a copy of this formatter with a new override chronology. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested DecimalStyle, not nullthe new DecimalStyle, not null decimalStyle)Returns a copy of this formatter with a new DecimalStyle. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested locale, not nullthe new locale, not null locale)Returns a copy of this formatter with a new locale. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested resolver style, not nullthe new set of resolver fields, null if no fields resolverFields)Returns a copy of this formatter with a new set of resolver fields. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested resolver style, not nullthe new set of resolver fields, null if no fields resolverFields)Returns a copy of this formatter with a new set of resolver fields. |
public DateTimeFormatter | Returns: a formatter based on this formatter with the requested resolver style, not nullthe new resolver style, not null resolverStyle)Returns a copy of this formatter with a new resolver style. |
public DateTimeFormatter |