src/java.base/share/classes/java/time/format/DateTimeFormatter.java
author naoto
Thu, 20 Jun 2019 11:21:54 -0700
changeset 55446 1aae575eb1ef
parent 54206 003cc64366da
permissions -rw-r--r--
8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring Reviewed-by: lancea, rriggs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     1
/*
54206
003cc64366da 8220249: fix headings in java.compiler
jjg
parents: 52012
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     4
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    10
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    15
 * accompanied this code).
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    16
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    20
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    23
 * questions.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    24
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    25
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    26
/*
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    27
 * This file is available under and governed by the GNU General Public
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    28
 * License version 2 only, as published by the Free Software Foundation.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    29
 * However, the following notice accompanied the original version of this
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    30
 * file:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    31
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    32
 * Copyright (c) 2008-2012, Stephen Colebourne & Michael Nascimento Santos
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    33
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    34
 * All rights reserved.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    35
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    36
 * Redistribution and use in source and binary forms, with or without
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    37
 * modification, are permitted provided that the following conditions are met:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    38
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    39
 *  * Redistributions of source code must retain the above copyright notice,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    40
 *    this list of conditions and the following disclaimer.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    41
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    42
 *  * Redistributions in binary form must reproduce the above copyright notice,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    43
 *    this list of conditions and the following disclaimer in the documentation
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    44
 *    and/or other materials provided with the distribution.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    45
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    46
 *  * Neither the name of JSR-310 nor the names of its contributors
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    47
 *    may be used to endorse or promote products derived from this software
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    48
 *    without specific prior written permission.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    49
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    50
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    51
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    52
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    53
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    54
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    55
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    56
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    57
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    58
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    59
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    60
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    61
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    62
package java.time.format;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    63
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    64
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    65
import static java.time.temporal.ChronoField.DAY_OF_WEEK;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    66
import static java.time.temporal.ChronoField.DAY_OF_YEAR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    67
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    68
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    69
import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    70
import static java.time.temporal.ChronoField.NANO_OF_SECOND;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    71
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    72
import static java.time.temporal.ChronoField.YEAR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    73
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    74
import java.io.IOException;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    75
import java.text.FieldPosition;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    76
import java.text.Format;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    77
import java.text.ParseException;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    78
import java.text.ParsePosition;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    79
import java.time.DateTimeException;
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
    80
import java.time.Period;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    81
import java.time.ZoneId;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    82
import java.time.ZoneOffset;
34831
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
    83
import java.time.chrono.ChronoLocalDateTime;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    84
import java.time.chrono.Chronology;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    85
import java.time.chrono.IsoChronology;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    86
import java.time.format.DateTimeFormatterBuilder.CompositePrinterParser;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    87
import java.time.temporal.ChronoField;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    88
import java.time.temporal.IsoFields;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    89
import java.time.temporal.TemporalAccessor;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    90
import java.time.temporal.TemporalField;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    91
import java.time.temporal.TemporalQuery;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    92
import java.util.Arrays;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    93
import java.util.Collections;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    94
import java.util.HashMap;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    95
import java.util.HashSet;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    96
import java.util.Locale;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    97
import java.util.Map;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    98
import java.util.Objects;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    99
import java.util.Set;
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
   100
import sun.util.locale.provider.TimeZoneNameUtility;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   101
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   102
/**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   103
 * Formatter for printing and parsing date-time objects.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   104
 * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   105
 * This class provides the main application entry point for printing and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   106
 * and provides common implementations of {@code DateTimeFormatter}:
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   107
 * <ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   108
 * <li>Using predefined constants, such as {@link #ISO_LOCAL_DATE}</li>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   109
 * <li>Using pattern letters, such as {@code uuuu-MMM-dd}</li>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   110
 * <li>Using localized styles, such as {@code long} or {@code medium}</li>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   111
 * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   112
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   113
 * More complex formatters are provided by
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   114
 * {@link DateTimeFormatterBuilder DateTimeFormatterBuilder}.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   115
 *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   116
 * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   117
 * The main date-time classes provide two methods - one for formatting,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   118
 * {@code format(DateTimeFormatter formatter)}, and one for parsing,
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   119
 * {@code parse(CharSequence text, DateTimeFormatter formatter)}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   120
 * <p>For example:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   121
 * <blockquote><pre>
28751
47403deaec44 8068284: Missing @throws in DateTimeFormatterBuilder.appendOffset
rriggs
parents: 28059
diff changeset
   122
 *  LocalDate date = LocalDate.now();
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 23722
diff changeset
   123
 *  String text = date.format(formatter);
28751
47403deaec44 8068284: Missing @throws in DateTimeFormatterBuilder.appendOffset
rriggs
parents: 28059
diff changeset
   124
 *  LocalDate parsedDate = LocalDate.parse(text, formatter);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   125
 * </pre></blockquote>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   126
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   127
 * In addition to the format, formatters can be created with desired Locale,
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   128
 * Chronology, ZoneId, and DecimalStyle.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   129
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   130
 * The {@link #withLocale withLocale} method returns a new formatter that
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   131
 * overrides the locale. The locale affects some aspects of formatting and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   132
 * parsing. For example, the {@link #ofLocalizedDate ofLocalizedDate} provides a
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   133
 * formatter that uses the locale specific date format.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   134
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   135
 * The {@link #withChronology withChronology} method returns a new formatter
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   136
 * that overrides the chronology. If overridden, the date-time value is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   137
 * converted to the chronology before formatting. During parsing the date-time
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   138
 * value is converted to the chronology before it is returned.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   139
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   140
 * The {@link #withZone withZone} method returns a new formatter that overrides
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   141
 * the zone. If overridden, the date-time value is converted to a ZonedDateTime
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   142
 * with the requested ZoneId before formatting. During parsing the ZoneId is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   143
 * applied before the value is returned.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   144
 * <p>
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   145
 * The {@link #withDecimalStyle withDecimalStyle} method returns a new formatter that
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   146
 * overrides the {@link DecimalStyle}. The DecimalStyle symbols are used for
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   147
 * formatting and parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   148
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   149
 * Some applications may need to use the older {@link Format java.text.Format}
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   150
 * class for formatting. The {@link #toFormat()} method returns an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   151
 * implementation of {@code java.text.Format}.
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   152
 *
54206
003cc64366da 8220249: fix headings in java.compiler
jjg
parents: 52012
diff changeset
   153
 * <h2 id="predefined">Predefined Formatters</h2>
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   154
 * <table class="striped" style="text-align:left">
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   155
 * <caption>Predefined Formatters</caption>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   156
 * <thead>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   157
 * <tr>
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   158
 * <th scope="col">Formatter</th>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   159
 * <th scope="col">Description</th>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   160
 * <th scope="col">Example</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   161
 * </tr>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   162
 * </thead>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   163
 * <tbody>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   164
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   165
 * <th scope="row">{@link #ofLocalizedDate ofLocalizedDate(dateStyle)} </th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   166
 * <td> Formatter with date style from the locale </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   167
 * <td> '2011-12-03'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   168
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   169
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   170
 * <th scope="row"> {@link #ofLocalizedTime ofLocalizedTime(timeStyle)} </th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   171
 * <td> Formatter with time style from the locale </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   172
 * <td> '10:15:30'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   173
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   174
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   175
 * <th scope="row"> {@link #ofLocalizedDateTime ofLocalizedDateTime(dateTimeStyle)} </th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   176
 * <td> Formatter with a style for date and time from the locale</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   177
 * <td> '3 Jun 2008 11:05:30'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   178
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   179
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   180
 * <th scope="row"> {@link #ofLocalizedDateTime ofLocalizedDateTime(dateStyle,timeStyle)}
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   181
 * </th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   182
 * <td> Formatter with date and time styles from the locale </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   183
 * <td> '3 Jun 2008 11:05'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   184
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   185
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   186
 * <th scope="row"> {@link #BASIC_ISO_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   187
 * <td>Basic ISO date </td> <td>'20111203'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   188
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   189
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   190
 * <th scope="row"> {@link #ISO_LOCAL_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   191
 * <td> ISO Local Date </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   192
 * <td>'2011-12-03'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   193
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   194
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   195
 * <th scope="row"> {@link #ISO_OFFSET_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   196
 * <td> ISO Date with offset </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   197
 * <td>'2011-12-03+01:00'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   198
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   199
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   200
 * <th scope="row"> {@link #ISO_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   201
 * <td> ISO Date with or without offset </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   202
 * <td> '2011-12-03+01:00'; '2011-12-03'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   203
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   204
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   205
 * <th scope="row"> {@link #ISO_LOCAL_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   206
 * <td> Time without offset </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   207
 * <td>'10:15:30'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   208
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   209
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   210
 * <th scope="row"> {@link #ISO_OFFSET_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   211
 * <td> Time with offset </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   212
 * <td>'10:15:30+01:00'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   213
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   214
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   215
 * <th scope="row"> {@link #ISO_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   216
 * <td> Time with or without offset </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   217
 * <td>'10:15:30+01:00'; '10:15:30'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   218
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   219
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   220
 * <th scope="row"> {@link #ISO_LOCAL_DATE_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   221
 * <td> ISO Local Date and Time </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   222
 * <td>'2011-12-03T10:15:30'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   223
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   224
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   225
 * <th scope="row"> {@link #ISO_OFFSET_DATE_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   226
 * <td> Date Time with Offset
46900
e92e67ed12b4 8186466: Fix accessibility and other minor issues in java.base
jjg
parents: 46149
diff changeset
   227
 * </td><td>'2011-12-03T10:15:30+01:00'</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   228
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   229
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   230
 * <th scope="row"> {@link #ISO_ZONED_DATE_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   231
 * <td> Zoned Date Time </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   232
 * <td>'2011-12-03T10:15:30+01:00[Europe/Paris]'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   233
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   234
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   235
 * <th scope="row"> {@link #ISO_DATE_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   236
 * <td> Date and time with ZoneId </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   237
 * <td>'2011-12-03T10:15:30+01:00[Europe/Paris]'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   238
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   239
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   240
 * <th scope="row"> {@link #ISO_ORDINAL_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   241
 * <td> Year and day of year </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   242
 * <td>'2012-337'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   243
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   244
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   245
 * <th scope="row"> {@link #ISO_WEEK_DATE}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   246
 * <td> Year and Week </td>
46900
e92e67ed12b4 8186466: Fix accessibility and other minor issues in java.base
jjg
parents: 46149
diff changeset
   247
 * <td>'2012-W48-6'</td></tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   248
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   249
 * <th scope="row"> {@link #ISO_INSTANT}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   250
 * <td> Date and Time of an Instant </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   251
 * <td>'2011-12-03T10:15:30Z' </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   252
 * </tr>
45124
144479e89cdb 8179592: Update tables in java.base to be HTML 5-friendly.
jjg
parents: 44846
diff changeset
   253
 * <tr>
45881
aaec0fbe17ae 8184208: update class="striped" tables for accessibility
jjg
parents: 45124
diff changeset
   254
 * <th scope="row"> {@link #RFC_1123_DATE_TIME}</th>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   255
 * <td> RFC 1123 / RFC 822 </td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   256
 * <td>'Tue, 3 Jun 2008 11:05:30 GMT'</td>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   257
 * </tr>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   258
 * </tbody>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   259
 * </table>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   260
 *
54206
003cc64366da 8220249: fix headings in java.compiler
jjg
parents: 52012
diff changeset
   261
 * <h2 id="patterns">Patterns for Formatting and Parsing</h2>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   262
 * Patterns are based on a simple sequence of letters and symbols.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   263
 * A pattern is used to create a Formatter using the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   264
 * {@link #ofPattern(String)} and {@link #ofPattern(String, Locale)} methods.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   265
 * For example,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   266
 * {@code "d MMM uuuu"} will format 2011-12-03 as '3&nbsp;Dec&nbsp;2011'.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   267
 * A formatter created from a pattern can be used as many times as necessary,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   268
 * it is immutable and is thread-safe.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   269
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   270
 * For example:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   271
 * <blockquote><pre>
28751
47403deaec44 8068284: Missing @throws in DateTimeFormatterBuilder.appendOffset
rriggs
parents: 28059
diff changeset
   272
 *  LocalDate date = LocalDate.now();
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 18591
diff changeset
   273
 *  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 23722
diff changeset
   274
 *  String text = date.format(formatter);
28751
47403deaec44 8068284: Missing @throws in DateTimeFormatterBuilder.appendOffset
rriggs
parents: 28059
diff changeset
   275
 *  LocalDate parsedDate = LocalDate.parse(text, formatter);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   276
 * </pre></blockquote>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   277
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   278
 * All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. The
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   279
 * following pattern letters are defined:
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   280
 * <table class="striped">
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   281
 * <caption>Pattern Letters and Symbols</caption>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   282
 * <thead>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   283
 *  <tr><th scope="col">Symbol</th>   <th scope="col">Meaning</th>         <th scope="col">Presentation</th> <th scope="col">Examples</th>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   284
 * </thead>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   285
 * <tbody>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   286
 *   <tr><th scope="row">G</th>       <td>era</td>                         <td>text</td>              <td>AD; Anno Domini; A</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   287
 *   <tr><th scope="row">u</th>       <td>year</td>                        <td>year</td>              <td>2004; 04</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   288
 *   <tr><th scope="row">y</th>       <td>year-of-era</td>                 <td>year</td>              <td>2004; 04</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   289
 *   <tr><th scope="row">D</th>       <td>day-of-year</td>                 <td>number</td>            <td>189</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   290
 *   <tr><th scope="row">M/L</th>     <td>month-of-year</td>               <td>number/text</td>       <td>7; 07; Jul; July; J</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   291
 *   <tr><th scope="row">d</th>       <td>day-of-month</td>                <td>number</td>            <td>10</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   292
 *   <tr><th scope="row">g</th>       <td>modified-julian-day</td>         <td>number</td>            <td>2451334</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   293
 *
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   294
 *   <tr><th scope="row">Q/q</th>     <td>quarter-of-year</td>             <td>number/text</td>       <td>3; 03; Q3; 3rd quarter</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   295
 *   <tr><th scope="row">Y</th>       <td>week-based-year</td>             <td>year</td>              <td>1996; 96</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   296
 *   <tr><th scope="row">w</th>       <td>week-of-week-based-year</td>     <td>number</td>            <td>27</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   297
 *   <tr><th scope="row">W</th>       <td>week-of-month</td>               <td>number</td>            <td>4</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   298
 *   <tr><th scope="row">E</th>       <td>day-of-week</td>                 <td>text</td>              <td>Tue; Tuesday; T</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   299
 *   <tr><th scope="row">e/c</th>     <td>localized day-of-week</td>       <td>number/text</td>       <td>2; 02; Tue; Tuesday; T</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   300
 *   <tr><th scope="row">F</th>       <td>day-of-week-in-month</td>        <td>number</td>            <td>3</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   301
 *
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   302
 *   <tr><th scope="row">a</th>       <td>am-pm-of-day</td>                <td>text</td>              <td>PM</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   303
 *   <tr><th scope="row">h</th>       <td>clock-hour-of-am-pm (1-12)</td>  <td>number</td>            <td>12</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   304
 *   <tr><th scope="row">K</th>       <td>hour-of-am-pm (0-11)</td>        <td>number</td>            <td>0</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   305
 *   <tr><th scope="row">k</th>       <td>clock-hour-of-day (1-24)</td>    <td>number</td>            <td>24</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   306
 *
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   307
 *   <tr><th scope="row">H</th>       <td>hour-of-day (0-23)</td>          <td>number</td>            <td>0</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   308
 *   <tr><th scope="row">m</th>       <td>minute-of-hour</td>              <td>number</td>            <td>30</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   309
 *   <tr><th scope="row">s</th>       <td>second-of-minute</td>            <td>number</td>            <td>55</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   310
 *   <tr><th scope="row">S</th>       <td>fraction-of-second</td>          <td>fraction</td>          <td>978</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   311
 *   <tr><th scope="row">A</th>       <td>milli-of-day</td>                <td>number</td>            <td>1234</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   312
 *   <tr><th scope="row">n</th>       <td>nano-of-second</td>              <td>number</td>            <td>987654321</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   313
 *   <tr><th scope="row">N</th>       <td>nano-of-day</td>                 <td>number</td>            <td>1234000000</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   314
 *
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   315
 *   <tr><th scope="row">V</th>       <td>time-zone ID</td>                <td>zone-id</td>           <td>America/Los_Angeles; Z; -08:30</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   316
 *   <tr><th scope="row">v</th>       <td>generic time-zone name</td>      <td>zone-name</td>         <td>Pacific Time; PT</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   317
 *   <tr><th scope="row">z</th>       <td>time-zone name</td>              <td>zone-name</td>         <td>Pacific Standard Time; PST</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   318
 *   <tr><th scope="row">O</th>       <td>localized zone-offset</td>       <td>offset-O</td>          <td>GMT+8; GMT+08:00; UTC-08:00</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   319
 *   <tr><th scope="row">X</th>       <td>zone-offset 'Z' for zero</td>    <td>offset-X</td>          <td>Z; -08; -0830; -08:30; -083015; -08:30:15</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   320
 *   <tr><th scope="row">x</th>       <td>zone-offset</td>                 <td>offset-x</td>          <td>+0000; -08; -0830; -08:30; -083015; -08:30:15</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   321
 *   <tr><th scope="row">Z</th>       <td>zone-offset</td>                 <td>offset-Z</td>          <td>+0000; -0800; -08:00</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   322
 *
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   323
 *   <tr><th scope="row">p</th>       <td>pad next</td>                    <td>pad modifier</td>      <td>1</td>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   324
 *
46149
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   325
 *   <tr><th scope="row">'</th>       <td>escape for text</td>             <td>delimiter</td>         <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   326
 *   <tr><th scope="row">''</th>      <td>single quote</td>                <td>literal</td>           <td>'</td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   327
 *   <tr><th scope="row">[</th>       <td>optional section start</td>      <td></td>                  <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   328
 *   <tr><th scope="row">]</th>       <td>optional section end</td>        <td></td>                  <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   329
 *   <tr><th scope="row">#</th>       <td>reserved for future use</td>     <td></td>                  <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   330
 *   <tr><th scope="row">{</th>       <td>reserved for future use</td>     <td></td>                  <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   331
 *   <tr><th scope="row">}</th>       <td>reserved for future use</td>     <td></td>                  <td></td>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   332
 * </tbody>
b515ebc3db98 8186153: Fix a11y and HTML issues in the java.math, java.text and java.time packages
jjg
parents: 45881
diff changeset
   333
 * </table>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   334
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   335
 * The count of pattern letters determines the format.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   336
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   337
 * <b>Text</b>: The text style is determined based on the number of pattern
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   338
 * letters used. Less than 4 pattern letters will use the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   339
 * {@link TextStyle#SHORT short form}. Exactly 4 pattern letters will use the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   340
 * {@link TextStyle#FULL full form}. Exactly 5 pattern letters will use the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   341
 * {@link TextStyle#NARROW narrow form}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   342
 * Pattern letters 'L', 'c', and 'q' specify the stand-alone form of the text styles.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   343
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   344
 * <b>Number</b>: If the count of letters is one, then the value is output using
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   345
 * the minimum number of digits and without padding. Otherwise, the count of digits
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   346
 * is used as the width of the output field, with the value zero-padded as necessary.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   347
 * The following pattern letters have constraints on the count of letters.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   348
 * Only one letter of 'c' and 'F' can be specified.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   349
 * Up to two letters of 'd', 'H', 'h', 'K', 'k', 'm', and 's' can be specified.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   350
 * Up to three letters of 'D' can be specified.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   351
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   352
 * <b>Number/Text</b>: If the count of pattern letters is 3 or greater, use the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   353
 * Text rules above. Otherwise use the Number rules above.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   354
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   355
 * <b>Fraction</b>: Outputs the nano-of-second field as a fraction-of-second.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   356
 * The nano-of-second value has nine digits, thus the count of pattern letters
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   357
 * is from 1 to 9. If it is less than 9, then the nano-of-second value is
22654
da81e0be094a 8032749: Typo in java.time.Clock
rriggs
parents: 20873
diff changeset
   358
 * truncated, with only the most significant digits being output.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   359
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   360
 * <b>Year</b>: The count of letters determines the minimum field width below
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   361
 * which padding is used. If the count of letters is two, then a
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   362
 * {@link DateTimeFormatterBuilder#appendValueReduced reduced} two digit form is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   363
 * used. For printing, this outputs the rightmost two digits. For parsing, this
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   364
 * will parse using the base value of 2000, resulting in a year within the range
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   365
 * 2000 to 2099 inclusive. If the count of letters is less than four (but not
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   366
 * two), then the sign is only output for negative years as per
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   367
 * {@link SignStyle#NORMAL}. Otherwise, the sign is output if the pad width is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   368
 * exceeded, as per {@link SignStyle#EXCEEDS_PAD}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   369
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   370
 * <b>ZoneId</b>: This outputs the time-zone ID, such as 'Europe/Paris'. If the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   371
 * count of letters is two, then the time-zone ID is output. Any other count of
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   372
 * letters throws {@code IllegalArgumentException}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   373
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   374
 * <b>Zone names</b>: This outputs the display name of the time-zone ID. If the
37907
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   375
 * pattern letter is 'z' the output is the daylight savings aware zone name.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   376
 * If there is insufficient information to determine whether DST applies,
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   377
 * the name ignoring daylight savings time will be used.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   378
 * If the count of letters is one, two or three, then the short name is output.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   379
 * If the count of letters is four, then the full name is output.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   380
 * Five or more letters throws {@code IllegalArgumentException}.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   381
 * <p>
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   382
 * If the pattern letter is 'v' the output provides the zone name ignoring
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   383
 * daylight savings time. If the count of letters is one, then the short name is output.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   384
 * If the count of letters is four, then the full name is output.
643c10927a1a 8155823: Add date-time patterns 'v' and 'vvvv'
ntv
parents: 37599
diff changeset
   385
 * Two, three and five or more letters throw {@code IllegalArgumentException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   386
 * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   387
 * <b>Offset X and x</b>: This formats the offset based on the number of pattern
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   388
 * letters. One letter outputs just the hour, such as '+01', unless the minute
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   389
 * is non-zero in which case the minute is also output, such as '+0130'. Two
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   390
 * letters outputs the hour and minute, without a colon, such as '+0130'. Three
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   391
 * letters outputs the hour and minute, with a colon, such as '+01:30'. Four
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   392
 * letters outputs the hour and minute and optional second, without a colon,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   393
 * such as '+013015'. Five letters outputs the hour and minute and optional
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   394
 * second, with a colon, such as '+01:30:15'. Six or more letters throws
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   395
 * {@code IllegalArgumentException}. Pattern letter 'X' (upper case) will output
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   396
 * 'Z' when the offset to be output would be zero, whereas pattern letter 'x'
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   397
 * (lower case) will output '+00', '+0000', or '+00:00'.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   398
 * <p>
55446
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   399
 * <b>Offset O</b>: With a non-zero offset, this formats the localized offset
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   400
 * based on the number of pattern letters. One letter outputs the
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   401
 * {@linkplain TextStyle#SHORT short} form of the localized offset, which is
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   402
 * localized offset text, such as 'GMT', with hour without leading zero, optional
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   403
 * 2-digit minute and second if non-zero, and colon, for example 'GMT+8'. Four
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   404
 * letters outputs the {@linkplain TextStyle#FULL full} form, which is localized
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   405
 * offset text, such as 'GMT, with 2-digit hour and minute field, optional second
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   406
 * field if non-zero, and colon, for example 'GMT+08:00'. If the offset is zero,
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   407
 * only localized text is output. Any other count of letters throws
1aae575eb1ef 8220229: Timezone pattern "OOOO" does not result in the full "GMT+00:00" substring
naoto
parents: 54206
diff changeset
   408
 * {@code IllegalArgumentException}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   409
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   410
 * <b>Offset Z</b>: This formats the offset based on the number of pattern
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   411
 * letters. One, two or three letters outputs the hour and minute, without a
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   412
 * colon, such as '+0130'. The output will be '+0000' when the offset is zero.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   413
 * Four letters outputs the {@linkplain TextStyle#FULL full} form of localized
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   414
 * offset, equivalent to four letters of Offset-O. The output will be the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   415
 * corresponding localized offset text if the offset is zero. Five
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   416
 * letters outputs the hour, minute, with optional second if non-zero, with
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   417
 * colon. It outputs 'Z' if the offset is zero.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   418
 * Six or more letters throws {@code IllegalArgumentException}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   419
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   420
 * <b>Optional section</b>: The optional section markers work exactly like
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   421
 * calling {@link DateTimeFormatterBuilder#optionalStart()} and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   422
 * {@link DateTimeFormatterBuilder#optionalEnd()}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   423
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   424
 * <b>Pad modifier</b>: Modifies the pattern that immediately follows to be
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   425
 * padded with spaces. The pad width is determined by the number of pattern
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   426
 * letters. This is the same as calling
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   427
 * {@link DateTimeFormatterBuilder#padNext(int)}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   428
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   429
 * For example, 'ppH' outputs the hour-of-day padded on the left with spaces to
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   430
 * a width of 2.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   431
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   432
 * Any unrecognized letter is an error. Any non-letter character, other than
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   433
 * '[', ']', '{', '}', '#' and the single quote will be output directly.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   434
 * Despite this, it is recommended to use single quotes around all characters
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   435
 * that you want to output directly to ensure that future changes do not break
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   436
 * your application.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   437
 *
54206
003cc64366da 8220249: fix headings in java.compiler
jjg
parents: 52012
diff changeset
   438
 * <h2 id="resolving">Resolving</h2>
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   439
 * Parsing is implemented as a two-phase operation.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   440
 * First, the text is parsed using the layout defined by the formatter, producing
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   441
 * a {@code Map} of field to value, a {@code ZoneId} and a {@code Chronology}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   442
 * Second, the parsed data is <em>resolved</em>, by validating, combining and
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   443
 * simplifying the various fields into more useful ones.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   444
 * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   445
 * Five parsing methods are supplied by this class.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   446
 * Four of these perform both the parse and resolve phases.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   447
 * The fifth method, {@link #parseUnresolved(CharSequence, ParsePosition)},
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   448
 * only performs the first phase, leaving the result unresolved.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   449
 * As such, it is essentially a low-level operation.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   450
 * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   451
 * The resolve phase is controlled by two parameters, set on this class.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   452
 * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   453
 * The {@link ResolverStyle} is an enum that offers three different approaches,
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   454
 * strict, smart and lenient. The smart option is the default.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   455
 * It can be set using {@link #withResolverStyle(ResolverStyle)}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   456
 * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   457
 * The {@link #withResolverFields(TemporalField...)} parameter allows the
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   458
 * set of fields that will be resolved to be filtered before resolving starts.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   459
 * For example, if the formatter has parsed a year, month, day-of-month
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   460
 * and day-of-year, then there are two approaches to resolve a date:
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   461
 * (year + month + day-of-month) and (year + day-of-year).
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   462
 * The resolver fields allows one of the two approaches to be selected.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   463
 * If no resolver fields are set then both approaches must result in the same date.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   464
 * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   465
 * Resolving separate fields to form a complete date and time is a complex
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   466
 * process with behaviour distributed across a number of classes.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   467
 * It follows these steps:
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   468
 * <ol>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   469
 * <li>The chronology is determined.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   470
 * The chronology of the result is either the chronology that was parsed,
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   471
 * or if no chronology was parsed, it is the chronology set on this class,
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   472
 * or if that is null, it is {@code IsoChronology}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   473
 * <li>The {@code ChronoField} date fields are resolved.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   474
 * This is achieved using {@link Chronology#resolveDate(Map, ResolverStyle)}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   475
 * Documentation about field resolution is located in the implementation
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   476
 * of {@code Chronology}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   477
 * <li>The {@code ChronoField} time fields are resolved.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   478
 * This is documented on {@link ChronoField} and is the same for all chronologies.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   479
 * <li>Any fields that are not {@code ChronoField} are processed.
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   480
 * This is achieved using {@link TemporalField#resolve(Map, TemporalAccessor, ResolverStyle)}.
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   481
 * Documentation about field resolution is located in the implementation
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   482
 * of {@code TemporalField}.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   483
 * <li>The {@code ChronoField} date and time fields are re-resolved.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   484
 * This allows fields in step four to produce {@code ChronoField} values
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   485
 * and have them be processed into dates and times.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   486
 * <li>A {@code LocalTime} is formed if there is at least an hour-of-day available.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   487
 * This involves providing default values for minute, second and fraction of second.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   488
 * <li>Any remaining unresolved fields are cross-checked against any
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   489
 * date and/or time that was resolved. Thus, an earlier stage would resolve
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   490
 * (year + month + day-of-month) to a date, and this stage would check that
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   491
 * day-of-week was valid for the date.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   492
 * <li>If an {@linkplain #parsedExcessDays() excess number of days}
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   493
 * was parsed then it is added to the date if a date is available.
34831
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   494
 * <li> If a second-based field is present, but {@code LocalTime} was not parsed,
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   495
 * then the resolver ensures that milli, micro and nano second values are
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   496
 * available to meet the contract of {@link ChronoField}.
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   497
 * These will be set to zero if missing.
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   498
 * <li>If both date and time were parsed and either an offset or zone is present,
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   499
 * the field {@link ChronoField#INSTANT_SECONDS} is created.
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   500
 * If an offset was parsed then the offset will be combined with the
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   501
 * {@code LocalDateTime} to form the instant, with any zone ignored.
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   502
 * If a {@code ZoneId} was parsed without an offset then the zone will be
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   503
 * combined with the {@code LocalDateTime} to form the instant using the rules
dc7f444c7b85 8066982: ZonedDateTime.parse() returns wrong ZoneOffset around DST fall transition
igerasim
parents: 30821
diff changeset
   504
 * of {@link ChronoLocalDateTime#atZone(ZoneId)}.
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   505
 * </ol>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   506
 *
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   507
 * @implSpec
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   508
 * This class is immutable and thread-safe.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   509
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   510
 * @since 1.8
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   511
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   512
public final class DateTimeFormatter {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   513
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   514
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   515
     * The printer and/or parser to use, not null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   516
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   517
    private final CompositePrinterParser printerParser;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   518
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   519
     * The locale to use for formatting, not null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   520
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   521
    private final Locale locale;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   522
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   523
     * The symbols to use for formatting, not null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   524
     */
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   525
    private final DecimalStyle decimalStyle;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   526
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   527
     * The resolver style to use, not null.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   528
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   529
    private final ResolverStyle resolverStyle;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   530
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   531
     * The fields to use in resolving, null for all fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   532
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   533
    private final Set<TemporalField> resolverFields;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   534
    /**
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   535
     * The chronology to use for formatting, null for no override.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   536
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   537
    private final Chronology chrono;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   538
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   539
     * The zone to use for formatting, null for no override.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   540
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   541
    private final ZoneId zone;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   542
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   543
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   544
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   545
     * Creates a formatter using the specified pattern.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   546
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   547
     * This method will create a formatter based on a simple
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   548
     * <a href="#patterns">pattern of letters and symbols</a>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   549
     * as described in the class documentation.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   550
     * For example, {@code d MMM uuuu} will format 2011-12-03 as '3 Dec 2011'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   551
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   552
     * The formatter will use the {@link Locale#getDefault(Locale.Category) default FORMAT locale}.
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
   553
     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   554
     * Alternatively use the {@link #ofPattern(String, Locale)} variant of this method.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   555
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   556
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   557
     * It uses {@link ResolverStyle#SMART SMART} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   558
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   559
     * @param pattern  the pattern to use, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   560
     * @return the formatter based on the pattern, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   561
     * @throws IllegalArgumentException if the pattern is invalid
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   562
     * @see DateTimeFormatterBuilder#appendPattern(String)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   563
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   564
    public static DateTimeFormatter ofPattern(String pattern) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   565
        return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   566
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   567
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   568
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   569
     * Creates a formatter using the specified pattern and locale.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   570
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   571
     * This method will create a formatter based on a simple
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   572
     * <a href="#patterns">pattern of letters and symbols</a>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   573
     * as described in the class documentation.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   574
     * For example, {@code d MMM uuuu} will format 2011-12-03 as '3 Dec 2011'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   575
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   576
     * The formatter will use the specified locale.
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
   577
     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   578
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   579
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   580
     * It uses {@link ResolverStyle#SMART SMART} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   581
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   582
     * @param pattern  the pattern to use, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   583
     * @param locale  the locale to use, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   584
     * @return the formatter based on the pattern, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   585
     * @throws IllegalArgumentException if the pattern is invalid
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   586
     * @see DateTimeFormatterBuilder#appendPattern(String)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   587
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   588
    public static DateTimeFormatter ofPattern(String pattern, Locale locale) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   589
        return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter(locale);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   590
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   591
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   592
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   593
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   594
     * Returns a locale specific date format for the ISO chronology.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   595
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   596
     * This returns a formatter that will format or parse a date.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   597
     * The exact format pattern used varies by locale.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   598
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   599
     * The locale is determined from the formatter. The formatter returned directly by
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   600
     * this method will use the {@link Locale#getDefault(Locale.Category) default FORMAT locale}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   601
     * The locale can be controlled using {@link DateTimeFormatter#withLocale(Locale) withLocale(Locale)}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   602
     * on the result of this method.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   603
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   604
     * Note that the localized pattern is looked up lazily.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   605
     * This {@code DateTimeFormatter} holds the style required and the locale,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   606
     * looking up the pattern required on demand.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   607
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   608
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   609
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   610
     * It has no override zone and uses the {@link ResolverStyle#SMART SMART} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   611
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   612
     * @param dateStyle  the formatter style to obtain, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   613
     * @return the date formatter, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   614
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   615
    public static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   616
        Objects.requireNonNull(dateStyle, "dateStyle");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   617
        return new DateTimeFormatterBuilder().appendLocalized(dateStyle, null)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   618
                .toFormatter(ResolverStyle.SMART, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   619
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   620
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   621
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   622
     * Returns a locale specific time format for the ISO chronology.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   623
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   624
     * This returns a formatter that will format or parse a time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   625
     * The exact format pattern used varies by locale.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   626
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   627
     * The locale is determined from the formatter. The formatter returned directly by
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   628
     * this method will use the {@link Locale#getDefault(Locale.Category) default FORMAT locale}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   629
     * The locale can be controlled using {@link DateTimeFormatter#withLocale(Locale) withLocale(Locale)}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   630
     * on the result of this method.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   631
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   632
     * Note that the localized pattern is looked up lazily.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   633
     * This {@code DateTimeFormatter} holds the style required and the locale,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   634
     * looking up the pattern required on demand.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   635
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   636
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   637
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   638
     * It has no override zone and uses the {@link ResolverStyle#SMART SMART} resolver style.
36638
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   639
     * The {@code FULL} and {@code LONG} styles typically require a time-zone.
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   640
     * When formatting using these styles, a {@code ZoneId} must be available,
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   641
     * either by using {@code ZonedDateTime} or {@link DateTimeFormatter#withZone}.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   642
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   643
     * @param timeStyle  the formatter style to obtain, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   644
     * @return the time formatter, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   645
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   646
    public static DateTimeFormatter ofLocalizedTime(FormatStyle timeStyle) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   647
        Objects.requireNonNull(timeStyle, "timeStyle");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   648
        return new DateTimeFormatterBuilder().appendLocalized(null, timeStyle)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   649
                .toFormatter(ResolverStyle.SMART, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   650
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   651
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   652
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   653
     * Returns a locale specific date-time formatter for the ISO chronology.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   654
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   655
     * This returns a formatter that will format or parse a date-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   656
     * The exact format pattern used varies by locale.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   657
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   658
     * The locale is determined from the formatter. The formatter returned directly by
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   659
     * this method will use the {@link Locale#getDefault(Locale.Category) default FORMAT locale}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   660
     * The locale can be controlled using {@link DateTimeFormatter#withLocale(Locale) withLocale(Locale)}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   661
     * on the result of this method.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   662
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   663
     * Note that the localized pattern is looked up lazily.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   664
     * This {@code DateTimeFormatter} holds the style required and the locale,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   665
     * looking up the pattern required on demand.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   666
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   667
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   668
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   669
     * It has no override zone and uses the {@link ResolverStyle#SMART SMART} resolver style.
36638
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   670
     * The {@code FULL} and {@code LONG} styles typically require a time-zone.
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   671
     * When formatting using these styles, a {@code ZoneId} must be available,
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   672
     * either by using {@code ZonedDateTime} or {@link DateTimeFormatter#withZone}.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   673
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   674
     * @param dateTimeStyle  the formatter style to obtain, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   675
     * @return the date-time formatter, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   676
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   677
    public static DateTimeFormatter ofLocalizedDateTime(FormatStyle dateTimeStyle) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   678
        Objects.requireNonNull(dateTimeStyle, "dateTimeStyle");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   679
        return new DateTimeFormatterBuilder().appendLocalized(dateTimeStyle, dateTimeStyle)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   680
                .toFormatter(ResolverStyle.SMART, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   681
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   682
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   683
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   684
     * Returns a locale specific date and time format for the ISO chronology.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   685
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   686
     * This returns a formatter that will format or parse a date-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   687
     * The exact format pattern used varies by locale.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   688
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   689
     * The locale is determined from the formatter. The formatter returned directly by
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   690
     * this method will use the {@link Locale#getDefault() default FORMAT locale}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   691
     * The locale can be controlled using {@link DateTimeFormatter#withLocale(Locale) withLocale(Locale)}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   692
     * on the result of this method.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   693
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   694
     * Note that the localized pattern is looked up lazily.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   695
     * This {@code DateTimeFormatter} holds the style required and the locale,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   696
     * looking up the pattern required on demand.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   697
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   698
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   699
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   700
     * It has no override zone and uses the {@link ResolverStyle#SMART SMART} resolver style.
36638
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   701
     * The {@code FULL} and {@code LONG} styles typically require a time-zone.
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   702
     * When formatting using these styles, a {@code ZoneId} must be available,
bc1438c48f1b 8085887: java.time.format.FormatStyle.LONG or FULL causes unchecked exception
rriggs
parents: 34831
diff changeset
   703
     * either by using {@code ZonedDateTime} or {@link DateTimeFormatter#withZone}.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   704
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   705
     * @param dateStyle  the date formatter style to obtain, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   706
     * @param timeStyle  the time formatter style to obtain, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   707
     * @return the date, time or date-time formatter, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   708
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   709
    public static DateTimeFormatter ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   710
        Objects.requireNonNull(dateStyle, "dateStyle");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   711
        Objects.requireNonNull(timeStyle, "timeStyle");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   712
        return new DateTimeFormatterBuilder().appendLocalized(dateStyle, timeStyle)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   713
                .toFormatter(ResolverStyle.SMART, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   714
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   715
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   716
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   717
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   718
     * The ISO date formatter that formats or parses a date without an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   719
     * offset, such as '2011-12-03'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   720
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   721
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   722
     * the ISO-8601 extended local date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   723
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   724
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   725
     * <li>Four digits or more for the {@link ChronoField#YEAR year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   726
     * Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   727
     * Years outside that range will have a prefixed positive or negative symbol.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   728
     * <li>A dash
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   729
     * <li>Two digits for the {@link ChronoField#MONTH_OF_YEAR month-of-year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   730
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   731
     * <li>A dash
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   732
     * <li>Two digits for the {@link ChronoField#DAY_OF_MONTH day-of-month}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   733
     *  This is pre-padded by zero to ensure two digits.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   734
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   735
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   736
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   737
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   738
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   739
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   740
    public static final DateTimeFormatter ISO_LOCAL_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   741
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   742
        ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   743
                .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   744
                .appendLiteral('-')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   745
                .appendValue(MONTH_OF_YEAR, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   746
                .appendLiteral('-')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   747
                .appendValue(DAY_OF_MONTH, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   748
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   749
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   750
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   751
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   752
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   753
     * The ISO date formatter that formats or parses a date with an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   754
     * offset, such as '2011-12-03+01:00'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   755
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   756
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   757
     * the ISO-8601 extended offset date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   758
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   759
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   760
     * <li>The {@link #ISO_LOCAL_DATE}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   761
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   762
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   763
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   764
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   765
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   766
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   767
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   768
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   769
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   770
    public static final DateTimeFormatter ISO_OFFSET_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   771
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   772
        ISO_OFFSET_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   773
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   774
                .append(ISO_LOCAL_DATE)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   775
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   776
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   777
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   778
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   779
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   780
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   781
     * The ISO date formatter that formats or parses a date with the
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   782
     * offset if available, such as '2011-12-03' or '2011-12-03+01:00'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   783
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   784
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   785
     * the ISO-8601 extended date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   786
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   787
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   788
     * <li>The {@link #ISO_LOCAL_DATE}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   789
     * <li>If the offset is not available then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   790
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   791
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   792
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   793
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   794
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   795
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   796
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   797
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   798
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   799
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   800
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   801
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   802
    public static final DateTimeFormatter ISO_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   803
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   804
        ISO_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   805
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   806
                .append(ISO_LOCAL_DATE)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   807
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   808
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   809
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   810
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   811
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   812
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   813
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   814
     * The ISO time formatter that formats or parses a time without an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   815
     * offset, such as '10:15' or '10:15:30'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   816
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   817
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   818
     * the ISO-8601 extended local time format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   819
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   820
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   821
     * <li>Two digits for the {@link ChronoField#HOUR_OF_DAY hour-of-day}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   822
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   823
     * <li>A colon
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   824
     * <li>Two digits for the {@link ChronoField#MINUTE_OF_HOUR minute-of-hour}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   825
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   826
     * <li>If the second-of-minute is not available then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   827
     * <li>A colon
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   828
     * <li>Two digits for the {@link ChronoField#SECOND_OF_MINUTE second-of-minute}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   829
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   830
     * <li>If the nano-of-second is zero or not available then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   831
     * <li>A decimal point
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   832
     * <li>One to nine digits for the {@link ChronoField#NANO_OF_SECOND nano-of-second}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   833
     *  As many digits will be output as required.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   834
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   835
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   836
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   837
     * It uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   838
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   839
    public static final DateTimeFormatter ISO_LOCAL_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   840
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   841
        ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   842
                .appendValue(HOUR_OF_DAY, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   843
                .appendLiteral(':')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   844
                .appendValue(MINUTE_OF_HOUR, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   845
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   846
                .appendLiteral(':')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   847
                .appendValue(SECOND_OF_MINUTE, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   848
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   849
                .appendFraction(NANO_OF_SECOND, 0, 9, true)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   850
                .toFormatter(ResolverStyle.STRICT, null);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   851
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   852
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   853
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   854
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   855
     * The ISO time formatter that formats or parses a time with an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   856
     * offset, such as '10:15+01:00' or '10:15:30+01:00'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   857
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   858
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   859
     * the ISO-8601 extended offset time format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   860
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   861
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   862
     * <li>The {@link #ISO_LOCAL_TIME}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   863
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   864
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   865
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   866
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   867
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   868
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   869
     * It uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   870
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   871
    public static final DateTimeFormatter ISO_OFFSET_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   872
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   873
        ISO_OFFSET_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   874
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   875
                .append(ISO_LOCAL_TIME)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   876
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   877
                .toFormatter(ResolverStyle.STRICT, null);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   878
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   879
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   880
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   881
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   882
     * The ISO time formatter that formats or parses a time, with the
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   883
     * offset if available, such as '10:15', '10:15:30' or '10:15:30+01:00'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   884
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   885
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   886
     * the ISO-8601 extended offset time format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   887
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   888
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   889
     * <li>The {@link #ISO_LOCAL_TIME}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   890
     * <li>If the offset is not available then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   891
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   892
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   893
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   894
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   895
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   896
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   897
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   898
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   899
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   900
     * It uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   901
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   902
    public static final DateTimeFormatter ISO_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   903
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   904
        ISO_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   905
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   906
                .append(ISO_LOCAL_TIME)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   907
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   908
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   909
                .toFormatter(ResolverStyle.STRICT, null);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   910
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   911
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   912
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   913
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   914
     * The ISO date-time formatter that formats or parses a date-time without
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   915
     * an offset, such as '2011-12-03T10:15:30'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   916
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   917
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   918
     * the ISO-8601 extended offset date-time format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   919
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   920
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   921
     * <li>The {@link #ISO_LOCAL_DATE}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   922
     * <li>The letter 'T'. Parsing is case insensitive.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   923
     * <li>The {@link #ISO_LOCAL_TIME}
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   924
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   925
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   926
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   927
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   928
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   929
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   930
    public static final DateTimeFormatter ISO_LOCAL_DATE_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   931
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   932
        ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   933
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   934
                .append(ISO_LOCAL_DATE)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   935
                .appendLiteral('T')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   936
                .append(ISO_LOCAL_TIME)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   937
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   938
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   939
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   940
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   941
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   942
     * The ISO date-time formatter that formats or parses a date-time with an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   943
     * offset, such as '2011-12-03T10:15:30+01:00'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   944
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   945
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   946
     * the ISO-8601 extended offset date-time format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   947
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   948
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   949
     * <li>The {@link #ISO_LOCAL_DATE_TIME}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   950
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   951
     *  they will be handled even though this is not part of the ISO-8601 standard.
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
   952
     *  The offset parsing is lenient, which allows the minutes and seconds to be optional.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   953
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   954
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   955
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   956
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   957
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   958
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   959
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   960
    public static final DateTimeFormatter ISO_OFFSET_DATE_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   961
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   962
        ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   963
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   964
                .append(ISO_LOCAL_DATE_TIME)
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
   965
                .parseLenient()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   966
                .appendOffsetId()
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
   967
                .parseStrict()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   968
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   969
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   970
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   971
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   972
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   973
     * The ISO-like date-time formatter that formats or parses a date-time with
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   974
     * offset and zone, such as '2011-12-03T10:15:30+01:00[Europe/Paris]'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   975
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   976
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   977
     * a format that extends the ISO-8601 extended offset date-time format
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   978
     * to add the time-zone.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   979
     * The section in square brackets is not part of the ISO-8601 standard.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   980
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
   981
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   982
     * <li>The {@link #ISO_OFFSET_DATE_TIME}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   983
     * <li>If the zone ID is not available or is a {@code ZoneOffset} then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   984
     * <li>An open square bracket '['.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   985
     * <li>The {@link ZoneId#getId() zone ID}. This is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   986
     *  Parsing is case sensitive.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   987
     * <li>A close square bracket ']'.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   988
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   989
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   990
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   991
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   992
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   993
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   994
    public static final DateTimeFormatter ISO_ZONED_DATE_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   995
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   996
        ISO_ZONED_DATE_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   997
                .append(ISO_OFFSET_DATE_TIME)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   998
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   999
                .appendLiteral('[')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1000
                .parseCaseSensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1001
                .appendZoneRegionId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1002
                .appendLiteral(']')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1003
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1004
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1005
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1006
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1007
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1008
     * The ISO-like date-time formatter that formats or parses a date-time with
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1009
     * the offset and zone if available, such as '2011-12-03T10:15:30',
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1010
     * '2011-12-03T10:15:30+01:00' or '2011-12-03T10:15:30+01:00[Europe/Paris]'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1011
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1012
     * This returns an immutable formatter capable of formatting and parsing
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1013
     * the ISO-8601 extended local or offset date-time format, as well as the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1014
     * extended non-ISO form specifying the time-zone.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1015
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1016
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1017
     * <li>The {@link #ISO_LOCAL_DATE_TIME}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1018
     * <li>If the offset is not available to format or parse then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1019
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1020
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1021
     * <li>If the zone ID is not available or is a {@code ZoneOffset} then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1022
     * <li>An open square bracket '['.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1023
     * <li>The {@link ZoneId#getId() zone ID}. This is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1024
     *  Parsing is case sensitive.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1025
     * <li>A close square bracket ']'.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1026
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1027
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1028
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1029
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1030
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1031
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1032
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1033
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1034
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1035
    public static final DateTimeFormatter ISO_DATE_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1036
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1037
        ISO_DATE_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1038
                .append(ISO_LOCAL_DATE_TIME)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1039
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1040
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1041
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1042
                .appendLiteral('[')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1043
                .parseCaseSensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1044
                .appendZoneRegionId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1045
                .appendLiteral(']')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1046
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1047
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1048
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1049
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1050
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1051
     * The ISO date formatter that formats or parses the ordinal date
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1052
     * without an offset, such as '2012-337'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1053
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1054
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1055
     * the ISO-8601 extended ordinal date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1056
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1057
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1058
     * <li>Four digits or more for the {@link ChronoField#YEAR year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1059
     * Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1060
     * Years outside that range will have a prefixed positive or negative symbol.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1061
     * <li>A dash
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1062
     * <li>Three digits for the {@link ChronoField#DAY_OF_YEAR day-of-year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1063
     *  This is pre-padded by zero to ensure three digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1064
     * <li>If the offset is not available to format or parse then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1065
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1066
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1067
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1068
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1069
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1070
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1071
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1072
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1073
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1074
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1075
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1076
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1077
    public static final DateTimeFormatter ISO_ORDINAL_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1078
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1079
        ISO_ORDINAL_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1080
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1081
                .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1082
                .appendLiteral('-')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1083
                .appendValue(DAY_OF_YEAR, 3)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1084
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1085
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1086
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1087
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1088
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1089
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1090
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1091
     * The ISO date formatter that formats or parses the week-based date
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1092
     * without an offset, such as '2012-W48-6'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1093
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1094
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1095
     * the ISO-8601 extended week-based date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1096
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1097
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1098
     * <li>Four digits or more for the {@link IsoFields#WEEK_BASED_YEAR week-based-year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1099
     * Years in the range 0000 to 9999 will be pre-padded by zero to ensure four digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1100
     * Years outside that range will have a prefixed positive or negative symbol.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1101
     * <li>A dash
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1102
     * <li>The letter 'W'. Parsing is case insensitive.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1103
     * <li>Two digits for the {@link IsoFields#WEEK_OF_WEEK_BASED_YEAR week-of-week-based-year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1104
     *  This is pre-padded by zero to ensure three digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1105
     * <li>A dash
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1106
     * <li>One digit for the {@link ChronoField#DAY_OF_WEEK day-of-week}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1107
     *  The value run from Monday (1) to Sunday (7).
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1108
     * <li>If the offset is not available to format or parse then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1109
     * <li>The {@link ZoneOffset#getId() offset ID}. If the offset has seconds then
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1110
     *  they will be handled even though this is not part of the ISO-8601 standard.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1111
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1112
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1113
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1114
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1115
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1116
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1117
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1118
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1119
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1120
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1121
    public static final DateTimeFormatter ISO_WEEK_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1122
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1123
        ISO_WEEK_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1124
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1125
                .appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1126
                .appendLiteral("-W")
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1127
                .appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1128
                .appendLiteral('-')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1129
                .appendValue(DAY_OF_WEEK, 1)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1130
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1131
                .appendOffsetId()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1132
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1133
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1134
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1135
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1136
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1137
     * The ISO instant formatter that formats or parses an instant in UTC,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1138
     * such as '2011-12-03T10:15:30Z'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1139
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1140
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1141
     * the ISO-8601 instant format.
52012
6f58ecdb060a 8166138: DateTimeFormatter.ISO_INSTANT should handle offsets
nishjain
parents: 48251
diff changeset
  1142
     * When formatting, the instant will always be suffixed by 'Z' to indicate UTC.
6f58ecdb060a 8166138: DateTimeFormatter.ISO_INSTANT should handle offsets
nishjain
parents: 48251
diff changeset
  1143
     * The second-of-minute is always output.
28059
e576535359cc 8067377: My hobby: caning, then then canning, the the can-can
martin
parents: 25859
diff changeset
  1144
     * The nano-of-second outputs zero, three, six or nine digits as necessary.
52012
6f58ecdb060a 8166138: DateTimeFormatter.ISO_INSTANT should handle offsets
nishjain
parents: 48251
diff changeset
  1145
     * When parsing, the behaviour of {@link DateTimeFormatterBuilder#appendOffsetId()}
6f58ecdb060a 8166138: DateTimeFormatter.ISO_INSTANT should handle offsets
nishjain
parents: 48251
diff changeset
  1146
     * will be used to parse the offset, converting the instant to UTC as necessary.
6f58ecdb060a 8166138: DateTimeFormatter.ISO_INSTANT should handle offsets
nishjain
parents: 48251
diff changeset
  1147
     * The time to at least the seconds field is required.
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1148
     * Fractional seconds from zero to nine are parsed.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1149
     * The localized decimal style is not used.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1150
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1151
     * This is a special case formatter intended to allow a human readable form
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1152
     * of an {@link java.time.Instant}. The {@code Instant} class is designed to
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1153
     * only represent a point in time and internally stores a value in nanoseconds
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1154
     * from a fixed epoch of 1970-01-01Z. As such, an {@code Instant} cannot be
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1155
     * formatted as a date or time without providing some form of time-zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1156
     * This formatter allows the {@code Instant} to be formatted, by providing
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1157
     * a suitable conversion using {@code ZoneOffset.UTC}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1158
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1159
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1160
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1161
     * <li>The {@link #ISO_OFFSET_DATE_TIME} where the instant is converted from
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1162
     *  {@link ChronoField#INSTANT_SECONDS} and {@link ChronoField#NANO_OF_SECOND}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1163
     *  using the {@code UTC} offset. Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1164
     * </ul>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1165
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1166
     * The returned formatter has no override chronology or zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1167
     * It uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1168
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1169
    public static final DateTimeFormatter ISO_INSTANT;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1170
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1171
        ISO_INSTANT = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1172
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1173
                .appendInstant()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1174
                .toFormatter(ResolverStyle.STRICT, null);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1175
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1176
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1177
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1178
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1179
     * The ISO date formatter that formats or parses a date without an
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1180
     * offset, such as '20111203'.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1181
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1182
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1183
     * the ISO-8601 basic local date format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1184
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1185
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1186
     * <li>Four digits for the {@link ChronoField#YEAR year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1187
     *  Only years in the range 0000 to 9999 are supported.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1188
     * <li>Two digits for the {@link ChronoField#MONTH_OF_YEAR month-of-year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1189
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1190
     * <li>Two digits for the {@link ChronoField#DAY_OF_MONTH day-of-month}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1191
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1192
     * <li>If the offset is not available to format or parse then the format is complete.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1193
     * <li>The {@link ZoneOffset#getId() offset ID} without colons. If the offset has
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1194
     *  seconds then they will be handled even though this is not part of the ISO-8601 standard.
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
  1195
     *  The offset parsing is lenient, which allows the minutes and seconds to be optional.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1196
     *  Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1197
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1198
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1199
     * As this formatter has an optional element, it may be necessary to parse using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1200
     * {@link DateTimeFormatter#parseBest}.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1201
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1202
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1203
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1204
     * It has no override zone and uses the {@link ResolverStyle#STRICT STRICT} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1205
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1206
    public static final DateTimeFormatter BASIC_ISO_DATE;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1207
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1208
        BASIC_ISO_DATE = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1209
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1210
                .appendValue(YEAR, 4)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1211
                .appendValue(MONTH_OF_YEAR, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1212
                .appendValue(DAY_OF_MONTH, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1213
                .optionalStart()
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
  1214
                .parseLenient()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1215
                .appendOffset("+HHMMss", "Z")
36646
de0663d2d82e 8032051: "ZonedDateTime" class "parse" method fails with short time zone offset ("+01")
ntv
parents: 36638
diff changeset
  1216
                .parseStrict()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1217
                .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1218
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1219
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1220
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1221
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1222
     * The RFC-1123 date-time formatter, such as 'Tue, 3 Jun 2008 11:05:30 GMT'.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1223
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1224
     * This returns an immutable formatter capable of formatting and parsing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1225
     * most of the RFC-1123 format.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1226
     * RFC-1123 updates RFC-822 changing the year from two digits to four.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1227
     * This implementation requires a four digit year.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1228
     * This implementation also does not handle North American or military zone
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1229
     * names, only 'GMT' and offset amounts.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1230
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1231
     * The format consists of:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1232
     * <ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1233
     * <li>If the day-of-week is not available to format or parse then jump to day-of-month.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1234
     * <li>Three letter {@link ChronoField#DAY_OF_WEEK day-of-week} in English.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1235
     * <li>A comma
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1236
     * <li>A space
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1237
     * <li>One or two digits for the {@link ChronoField#DAY_OF_MONTH day-of-month}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1238
     * <li>A space
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1239
     * <li>Three letter {@link ChronoField#MONTH_OF_YEAR month-of-year} in English.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1240
     * <li>A space
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1241
     * <li>Four digits for the {@link ChronoField#YEAR year}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1242
     *  Only years in the range 0000 to 9999 are supported.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1243
     * <li>A space
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1244
     * <li>Two digits for the {@link ChronoField#HOUR_OF_DAY hour-of-day}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1245
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1246
     * <li>A colon
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1247
     * <li>Two digits for the {@link ChronoField#MINUTE_OF_HOUR minute-of-hour}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1248
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1249
     * <li>If the second-of-minute is not available then jump to the next space.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1250
     * <li>A colon
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1251
     * <li>Two digits for the {@link ChronoField#SECOND_OF_MINUTE second-of-minute}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1252
     *  This is pre-padded by zero to ensure two digits.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1253
     * <li>A space
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1254
     * <li>The {@link ZoneOffset#getId() offset ID} without colons or seconds.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1255
     *  An offset of zero uses "GMT". North American zone names and military zone names are not handled.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1256
     * </ul>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1257
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1258
     * Parsing is case insensitive.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1259
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1260
     * The returned formatter has a chronology of ISO set to ensure dates in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1261
     * other calendar systems are correctly converted.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1262
     * It has no override zone and uses the {@link ResolverStyle#SMART SMART} resolver style.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1263
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1264
    public static final DateTimeFormatter RFC_1123_DATE_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1265
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1266
        // manually code maps to ensure correct data always used
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1267
        // (locale data can be changed by application code)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1268
        Map<Long, String> dow = new HashMap<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1269
        dow.put(1L, "Mon");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1270
        dow.put(2L, "Tue");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1271
        dow.put(3L, "Wed");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1272
        dow.put(4L, "Thu");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1273
        dow.put(5L, "Fri");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1274
        dow.put(6L, "Sat");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1275
        dow.put(7L, "Sun");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1276
        Map<Long, String> moy = new HashMap<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1277
        moy.put(1L, "Jan");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1278
        moy.put(2L, "Feb");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1279
        moy.put(3L, "Mar");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1280
        moy.put(4L, "Apr");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1281
        moy.put(5L, "May");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1282
        moy.put(6L, "Jun");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1283
        moy.put(7L, "Jul");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1284
        moy.put(8L, "Aug");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1285
        moy.put(9L, "Sep");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1286
        moy.put(10L, "Oct");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1287
        moy.put(11L, "Nov");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1288
        moy.put(12L, "Dec");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1289
        RFC_1123_DATE_TIME = new DateTimeFormatterBuilder()
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1290
                .parseCaseInsensitive()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1291
                .parseLenient()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1292
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1293
                .appendText(DAY_OF_WEEK, dow)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1294
                .appendLiteral(", ")
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1295
                .optionalEnd()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1296
                .appendValue(DAY_OF_MONTH, 1, 2, SignStyle.NOT_NEGATIVE)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1297
                .appendLiteral(' ')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1298
                .appendText(MONTH_OF_YEAR, moy)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1299
                .appendLiteral(' ')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1300
                .appendValue(YEAR, 4)  // 2 digit year not handled
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1301
                .appendLiteral(' ')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1302
                .appendValue(HOUR_OF_DAY, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1303
                .appendLiteral(':')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1304
                .appendValue(MINUTE_OF_HOUR, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1305
                .optionalStart()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1306
                .appendLiteral(':')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1307
                .appendValue(SECOND_OF_MINUTE, 2)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1308
                .optionalEnd()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1309
                .appendLiteral(' ')
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1310
                .appendOffset("+HHMM", "GMT")  // should handle UT/Z/EST/EDT/CST/CDT/MST/MDT/PST/MDT
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1311
                .toFormatter(ResolverStyle.SMART, IsoChronology.INSTANCE);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1312
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1313
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1314
    //-----------------------------------------------------------------------
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1315
    /**
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1316
     * A query that provides access to the excess days that were parsed.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1317
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1318
     * This returns a singleton {@linkplain TemporalQuery query} that provides
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1319
     * access to additional information from the parse. The query always returns
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1320
     * a non-null period, with a zero period returned instead of null.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1321
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1322
     * There are two situations where this query may return a non-zero period.
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1323
     * <ul>
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1324
     * <li>If the {@code ResolverStyle} is {@code LENIENT} and a time is parsed
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1325
     *  without a date, then the complete result of the parse consists of a
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1326
     *  {@code LocalTime} and an excess {@code Period} in days.
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 19030
diff changeset
  1327
     *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1328
     * <li>If the {@code ResolverStyle} is {@code SMART} and a time is parsed
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1329
     *  without a date where the time is 24:00:00, then the complete result of
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1330
     *  the parse consists of a {@code LocalTime} of 00:00:00 and an excess
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1331
     *  {@code Period} of one day.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1332
     * </ul>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1333
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1334
     * In both cases, if a complete {@code ChronoLocalDateTime} or {@code Instant}
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1335
     * is parsed, then the excess days are added to the date part.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1336
     * As a result, this query will return a zero period.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1337
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1338
     * The {@code SMART} behaviour handles the common "end of day" 24:00 value.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1339
     * Processing in {@code LENIENT} mode also produces the same result:
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1340
     * <pre>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1341
     *  Text to parse        Parsed object                         Excess days
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1342
     *  "2012-12-03T00:00"   LocalDateTime.of(2012, 12, 3, 0, 0)   ZERO
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1343
     *  "2012-12-03T24:00"   LocalDateTime.of(2012, 12, 4, 0, 0)   ZERO
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1344
     *  "00:00"              LocalTime.of(0, 0)                    ZERO
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1345
     *  "24:00"              LocalTime.of(0, 0)                    Period.ofDays(1)
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1346
     * </pre>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1347
     * The query can be used as follows:
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1348
     * <pre>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1349
     *  TemporalAccessor parsed = formatter.parse(str);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1350
     *  LocalTime time = parsed.query(LocalTime::from);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1351
     *  Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays());
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1352
     * </pre>
18591
8202ea23bca7 8019535: Fix doclint issues in java.time.format
darcy
parents: 17474
diff changeset
  1353
     * @return a query that provides access to the excess days that were parsed
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1354
     */
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1355
    public static final TemporalQuery<Period> parsedExcessDays() {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1356
        return PARSED_EXCESS_DAYS;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1357
    }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1358
    private static final TemporalQuery<Period> PARSED_EXCESS_DAYS = t -> {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1359
        if (t instanceof Parsed) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1360
            return ((Parsed) t).excessDays;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1361
        } else {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1362
            return Period.ZERO;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1363
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1364
    };
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1365
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1366
    /**
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1367
     * A query that provides access to whether a leap-second was parsed.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1368
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1369
     * This returns a singleton {@linkplain TemporalQuery query} that provides
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1370
     * access to additional information from the parse. The query always returns
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1371
     * a non-null boolean, true if parsing saw a leap-second, false if not.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1372
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1373
     * Instant parsing handles the special "leap second" time of '23:59:60'.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1374
     * Leap seconds occur at '23:59:60' in the UTC time-zone, but at other
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1375
     * local times in different time-zones. To avoid this potential ambiguity,
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1376
     * the handling of leap-seconds is limited to
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1377
     * {@link DateTimeFormatterBuilder#appendInstant()}, as that method
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1378
     * always parses the instant with the UTC zone offset.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1379
     * <p>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1380
     * If the time '23:59:60' is received, then a simple conversion is applied,
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1381
     * replacing the second-of-minute of 60 with 59. This query can be used
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1382
     * on the parse result to determine if the leap-second adjustment was made.
30821
9bc6f2e9966b 8075678: java.time javadoc error in DateTimeFormatter::parsedLeapSecond
rriggs
parents: 28751
diff changeset
  1383
     * The query will return {@code true} if it did adjust to remove the
9bc6f2e9966b 8075678: java.time javadoc error in DateTimeFormatter::parsedLeapSecond
rriggs
parents: 28751
diff changeset
  1384
     * leap-second, and {@code false} if not. Note that applying a leap-second
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1385
     * smoothing mechanism, such as UTC-SLS, is the responsibility of the
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1386
     * application, as follows:
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1387
     * <pre>
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1388
     *  TemporalAccessor parsed = formatter.parse(str);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1389
     *  Instant instant = parsed.query(Instant::from);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1390
     *  if (parsed.query(DateTimeFormatter.parsedLeapSecond())) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1391
     *    // validate leap-second is correct and apply correct smoothing
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1392
     *  }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1393
     * </pre>
18591
8202ea23bca7 8019535: Fix doclint issues in java.time.format
darcy
parents: 17474
diff changeset
  1394
     * @return a query that provides access to whether a leap-second was parsed
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1395
     */
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1396
    public static final TemporalQuery<Boolean> parsedLeapSecond() {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1397
        return PARSED_LEAP_SECOND;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1398
    }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1399
    private static final TemporalQuery<Boolean> PARSED_LEAP_SECOND = t -> {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1400
        if (t instanceof Parsed) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1401
            return ((Parsed) t).leapSecond;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1402
        } else {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1403
            return Boolean.FALSE;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1404
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1405
    };
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1406
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1407
    //-----------------------------------------------------------------------
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1408
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1409
     * Constructor.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1410
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1411
     * @param printerParser  the printer/parser to use, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1412
     * @param locale  the locale to use, not null
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1413
     * @param decimalStyle  the DecimalStyle to use, not null
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1414
     * @param resolverStyle  the resolver style to use, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1415
     * @param resolverFields  the fields to use during resolving, null for all fields
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1416
     * @param chrono  the chronology to use, null for no override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1417
     * @param zone  the zone to use, null for no override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1418
     */
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1419
    DateTimeFormatter(CompositePrinterParser printerParser,
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1420
            Locale locale, DecimalStyle decimalStyle,
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1421
            ResolverStyle resolverStyle, Set<TemporalField> resolverFields,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1422
            Chronology chrono, ZoneId zone) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1423
        this.printerParser = Objects.requireNonNull(printerParser, "printerParser");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1424
        this.resolverFields = resolverFields;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1425
        this.locale = Objects.requireNonNull(locale, "locale");
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1426
        this.decimalStyle = Objects.requireNonNull(decimalStyle, "decimalStyle");
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1427
        this.resolverStyle = Objects.requireNonNull(resolverStyle, "resolverStyle");
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1428
        this.chrono = chrono;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1429
        this.zone = zone;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1430
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1431
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1432
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1433
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1434
     * Gets the locale to be used during formatting.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1435
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1436
     * This is used to lookup any part of the formatter needing specific
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1437
     * localization, such as the text or localized pattern.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1438
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1439
     * @return the locale of this formatter, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1440
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1441
    public Locale getLocale() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1442
        return locale;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1443
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1444
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1445
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1446
     * Returns a copy of this formatter with a new locale.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1447
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1448
     * This is used to lookup any part of the formatter needing specific
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1449
     * localization, such as the text or localized pattern.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1450
     * <p>
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1451
     * The locale is stored as passed in, without further processing.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1452
     * If the locale has <a href="../../util/Locale.html#def_locale_extension">
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1453
     * Unicode extensions</a>, they may be used later in text
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1454
     * processing. To set the chronology, time-zone and decimal style from
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1455
     * unicode extensions, see {@link #localizedBy localizedBy()}.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1456
     * <p>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1457
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1458
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1459
     * @param locale  the new locale, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1460
     * @return a formatter based on this formatter with the requested locale, not null
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1461
     * @see #localizedBy(Locale)
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1462
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1463
    public DateTimeFormatter withLocale(Locale locale) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1464
        if (this.locale.equals(locale)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1465
            return this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1466
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1467
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1468
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1469
48251
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1470
    /**
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1471
     * Returns a copy of this formatter with localized values of the locale,
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1472
     * calendar, region, decimal style and/or timezone, that supercede values in
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1473
     * this formatter.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1474
     * <p>
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1475
     * This is used to lookup any part of the formatter needing specific
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1476
     * localization, such as the text or localized pattern. If the locale contains the
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1477
     * "ca" (calendar), "nu" (numbering system), "rg" (region override), and/or
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1478
     * "tz" (timezone)
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1479
     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1480
     * the chronology, numbering system and/or the zone are overridden. If both "ca"
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1481
     * and "rg" are specified, the chronology from the "ca" extension supersedes the
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1482
     * implicit one from the "rg" extension. Same is true for the "nu" extension.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1483
     * <p>
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1484
     * Unlike the {@link #withLocale withLocale} method, the call to this method may
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1485
     * produce a different formatter depending on the order of method chaining with
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1486
     * other withXXXX() methods.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1487
     * <p>
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1488
     * This instance is immutable and unaffected by this method call.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1489
     *
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1490
     * @param locale  the locale, not null
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1491
     * @return a formatter based on this formatter with localized values of
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1492
     *      the calendar, decimal style and/or timezone, that supercede values in this
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1493
     *      formatter.
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1494
     * @see #withLocale(Locale)
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1495
     * @since 10
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1496
     */
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1497
    public DateTimeFormatter localizedBy(Locale locale) {
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1498
        if (this.locale.equals(locale)) {
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1499
            return this;
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1500
        }
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1501
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1502
        // Check for decimalStyle/chronology/timezone in locale object
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1503
        Chronology c = locale.getUnicodeLocaleType("ca") != null ?
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1504
                       Chronology.ofLocale(locale) : chrono;
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1505
        DecimalStyle ds = locale.getUnicodeLocaleType("nu") != null ?
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1506
                       DecimalStyle.of(locale) : decimalStyle;
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1507
        String tzType = locale.getUnicodeLocaleType("tz");
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1508
        ZoneId z  = tzType != null ?
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1509
                    TimeZoneNameUtility.convertLDMLShortID(tzType)
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1510
                        .map(ZoneId::of)
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1511
                        .orElse(zone) :
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1512
                    zone;
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1513
        return new DateTimeFormatter(printerParser, locale, ds, resolverStyle, resolverFields, c, z);
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1514
    }
57148c79bd75 8176841: Additional Unicode Language-Tag Extensions
naoto
parents: 47216
diff changeset
  1515
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1516
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1517
    /**
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1518
     * Gets the DecimalStyle to be used during formatting.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1519
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1520
     * @return the locale of this formatter, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1521
     */
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1522
    public DecimalStyle getDecimalStyle() {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1523
        return decimalStyle;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1524
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1525
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1526
    /**
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1527
     * Returns a copy of this formatter with a new DecimalStyle.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1528
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1529
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1530
     *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1531
     * @param decimalStyle  the new DecimalStyle, not null
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1532
     * @return a formatter based on this formatter with the requested DecimalStyle, not null
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1533
     */
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1534
    public DateTimeFormatter withDecimalStyle(DecimalStyle decimalStyle) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1535
        if (this.decimalStyle.equals(decimalStyle)) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1536
            return this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1537
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1538
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1539
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1540
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1541
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1542
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1543
     * Gets the overriding chronology to be used during formatting.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1544
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1545
     * This returns the override chronology, used to convert dates.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1546
     * By default, a formatter has no override chronology, returning null.
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1547
     * See {@link #withChronology(Chronology)} for more details on overriding.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1548
     *
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1549
     * @return the override chronology of this formatter, null if no override
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1550
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1551
    public Chronology getChronology() {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1552
        return chrono;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1553
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1554
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1555
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1556
     * Returns a copy of this formatter with a new override chronology.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1557
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1558
     * This returns a formatter with similar state to this formatter but
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1559
     * with the override chronology set.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1560
     * By default, a formatter has no override chronology, returning null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1561
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1562
     * If an override is added, then any date that is formatted or parsed will be affected.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1563
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1564
     * When formatting, if the temporal object contains a date, then it will
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1565
     * be converted to a date in the override chronology.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1566
     * Whether the temporal contains a date is determined by querying the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1567
     * {@link ChronoField#EPOCH_DAY EPOCH_DAY} field.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1568
     * Any time or zone will be retained unaltered unless overridden.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1569
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1570
     * If the temporal object does not contain a date, but does contain one
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1571
     * or more {@code ChronoField} date fields, then a {@code DateTimeException}
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1572
     * is thrown. In all other cases, the override chronology is added to the temporal,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1573
     * replacing any previous chronology, but without changing the date/time.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1574
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1575
     * When parsing, there are two distinct cases to consider.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1576
     * If a chronology has been parsed directly from the text, perhaps because
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1577
     * {@link DateTimeFormatterBuilder#appendChronologyId()} was used, then
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1578
     * this override chronology has no effect.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1579
     * If no zone has been parsed, then this override chronology will be used
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1580
     * to interpret the {@code ChronoField} values into a date according to the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1581
     * date resolving rules of the chronology.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1582
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1583
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1584
     *
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1585
     * @param chrono  the new chronology, null if no override
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1586
     * @return a formatter based on this formatter with the requested override chronology, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1587
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1588
    public DateTimeFormatter withChronology(Chronology chrono) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1589
        if (Objects.equals(this.chrono, chrono)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1590
            return this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1591
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1592
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1593
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1594
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1595
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1596
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1597
     * Gets the overriding zone to be used during formatting.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1598
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1599
     * This returns the override zone, used to convert instants.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1600
     * By default, a formatter has no override zone, returning null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1601
     * See {@link #withZone(ZoneId)} for more details on overriding.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1602
     *
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1603
     * @return the override zone of this formatter, null if no override
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1604
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1605
    public ZoneId getZone() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1606
        return zone;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1607
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1608
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1609
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1610
     * Returns a copy of this formatter with a new override zone.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1611
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1612
     * This returns a formatter with similar state to this formatter but
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1613
     * with the override zone set.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1614
     * By default, a formatter has no override zone, returning null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1615
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1616
     * If an override is added, then any instant that is formatted or parsed will be affected.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1617
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1618
     * When formatting, if the temporal object contains an instant, then it will
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1619
     * be converted to a zoned date-time using the override zone.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1620
     * Whether the temporal is an instant is determined by querying the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1621
     * {@link ChronoField#INSTANT_SECONDS INSTANT_SECONDS} field.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1622
     * If the input has a chronology then it will be retained unless overridden.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1623
     * If the input does not have a chronology, such as {@code Instant}, then
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1624
     * the ISO chronology will be used.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1625
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1626
     * If the temporal object does not contain an instant, but does contain
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1627
     * an offset then an additional check is made. If the normalized override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1628
     * zone is an offset that differs from the offset of the temporal, then
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1629
     * a {@code DateTimeException} is thrown. In all other cases, the override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1630
     * zone is added to the temporal, replacing any previous zone, but without
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1631
     * changing the date/time.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1632
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1633
     * When parsing, there are two distinct cases to consider.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1634
     * If a zone has been parsed directly from the text, perhaps because
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1635
     * {@link DateTimeFormatterBuilder#appendZoneId()} was used, then
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1636
     * this override zone has no effect.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1637
     * If no zone has been parsed, then this override zone will be included in
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1638
     * the result of the parse where it can be used to build instants and date-times.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1639
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1640
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1641
     *
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1642
     * @param zone  the new override zone, null if no override
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1643
     * @return a formatter based on this formatter with the requested override zone, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1644
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1645
    public DateTimeFormatter withZone(ZoneId zone) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1646
        if (Objects.equals(this.zone, zone)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1647
            return this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1648
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1649
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1650
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1651
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1652
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1653
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1654
     * Gets the resolver style to use during parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1655
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1656
     * This returns the resolver style, used during the second phase of parsing
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1657
     * when fields are resolved into dates and times.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1658
     * By default, a formatter has the {@link ResolverStyle#SMART SMART} resolver style.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1659
     * See {@link #withResolverStyle(ResolverStyle)} for more details.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1660
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1661
     * @return the resolver style of this formatter, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1662
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1663
    public ResolverStyle getResolverStyle() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1664
        return resolverStyle;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1665
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1666
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1667
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1668
     * Returns a copy of this formatter with a new resolver style.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1669
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1670
     * This returns a formatter with similar state to this formatter but
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1671
     * with the resolver style set. By default, a formatter has the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1672
     * {@link ResolverStyle#SMART SMART} resolver style.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1673
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1674
     * Changing the resolver style only has an effect during parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1675
     * Parsing a text string occurs in two phases.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1676
     * Phase 1 is a basic text parse according to the fields added to the builder.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1677
     * Phase 2 resolves the parsed field-value pairs into date and/or time objects.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1678
     * The resolver style is used to control how phase 2, resolving, happens.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1679
     * See {@code ResolverStyle} for more information on the options available.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1680
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1681
     * This instance is immutable and unaffected by this method call.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1682
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1683
     * @param resolverStyle  the new resolver style, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1684
     * @return a formatter based on this formatter with the requested resolver style, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1685
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1686
    public DateTimeFormatter withResolverStyle(ResolverStyle resolverStyle) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1687
        Objects.requireNonNull(resolverStyle, "resolverStyle");
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1688
        if (Objects.equals(this.resolverStyle, resolverStyle)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1689
            return this;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1690
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1691
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1692
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1693
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1694
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1695
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1696
     * Gets the resolver fields to use during parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1697
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1698
     * This returns the resolver fields, used during the second phase of parsing
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1699
     * when fields are resolved into dates and times.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1700
     * By default, a formatter has no resolver fields, and thus returns null.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1701
     * See {@link #withResolverFields(Set)} for more details.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1702
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1703
     * @return the immutable set of resolver fields of this formatter, null if no fields
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1704
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1705
    public Set<TemporalField> getResolverFields() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1706
        return resolverFields;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1707
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1708
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1709
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1710
     * Returns a copy of this formatter with a new set of resolver fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1711
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1712
     * This returns a formatter with similar state to this formatter but with
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1713
     * the resolver fields set. By default, a formatter has no resolver fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1714
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1715
     * Changing the resolver fields only has an effect during parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1716
     * Parsing a text string occurs in two phases.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1717
     * Phase 1 is a basic text parse according to the fields added to the builder.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1718
     * Phase 2 resolves the parsed field-value pairs into date and/or time objects.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1719
     * The resolver fields are used to filter the field-value pairs between phase 1 and 2.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1720
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1721
     * This can be used to select between two or more ways that a date or time might
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1722
     * be resolved. For example, if the formatter consists of year, month, day-of-month
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1723
     * and day-of-year, then there are two ways to resolve a date.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1724
     * Calling this method with the arguments {@link ChronoField#YEAR YEAR} and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1725
     * {@link ChronoField#DAY_OF_YEAR DAY_OF_YEAR} will ensure that the date is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1726
     * resolved using the year and day-of-year, effectively meaning that the month
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1727
     * and day-of-month are ignored during the resolving phase.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1728
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1729
     * In a similar manner, this method can be used to ignore secondary fields that
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1730
     * would otherwise be cross-checked. For example, if the formatter consists of year,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1731
     * month, day-of-month and day-of-week, then there is only one way to resolve a
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1732
     * date, but the parsed value for day-of-week will be cross-checked against the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1733
     * resolved date. Calling this method with the arguments {@link ChronoField#YEAR YEAR},
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1734
     * {@link ChronoField#MONTH_OF_YEAR MONTH_OF_YEAR} and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1735
     * {@link ChronoField#DAY_OF_MONTH DAY_OF_MONTH} will ensure that the date is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1736
     * resolved correctly, but without any cross-check for the day-of-week.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1737
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1738
     * In implementation terms, this method behaves as follows. The result of the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1739
     * parsing phase can be considered to be a map of field to value. The behavior
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1740
     * of this method is to cause that map to be filtered between phase 1 and 2,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1741
     * removing all fields other than those specified as arguments to this method.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1742
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1743
     * This instance is immutable and unaffected by this method call.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1744
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1745
     * @param resolverFields  the new set of resolver fields, null if no fields
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1746
     * @return a formatter based on this formatter with the requested resolver style, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1747
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1748
    public DateTimeFormatter withResolverFields(TemporalField... resolverFields) {
23722
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1749
        Set<TemporalField> fields = null;
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1750
        if (resolverFields != null) {
41482
05e75e5f3afb 8134373: use collections convenience factories in the JDK
smarks
parents: 37907
diff changeset
  1751
            // Set.of cannot be used because it is hostile to nulls and duplicate elements
23722
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1752
            fields = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(resolverFields)));
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1753
        }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1754
        if (Objects.equals(this.resolverFields, fields)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1755
            return this;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1756
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1757
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, fields, chrono, zone);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1758
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1759
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1760
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1761
     * Returns a copy of this formatter with a new set of resolver fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1762
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1763
     * This returns a formatter with similar state to this formatter but with
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1764
     * the resolver fields set. By default, a formatter has no resolver fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1765
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1766
     * Changing the resolver fields only has an effect during parsing.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1767
     * Parsing a text string occurs in two phases.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1768
     * Phase 1 is a basic text parse according to the fields added to the builder.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1769
     * Phase 2 resolves the parsed field-value pairs into date and/or time objects.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1770
     * The resolver fields are used to filter the field-value pairs between phase 1 and 2.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1771
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1772
     * This can be used to select between two or more ways that a date or time might
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1773
     * be resolved. For example, if the formatter consists of year, month, day-of-month
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1774
     * and day-of-year, then there are two ways to resolve a date.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1775
     * Calling this method with the arguments {@link ChronoField#YEAR YEAR} and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1776
     * {@link ChronoField#DAY_OF_YEAR DAY_OF_YEAR} will ensure that the date is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1777
     * resolved using the year and day-of-year, effectively meaning that the month
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1778
     * and day-of-month are ignored during the resolving phase.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1779
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1780
     * In a similar manner, this method can be used to ignore secondary fields that
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1781
     * would otherwise be cross-checked. For example, if the formatter consists of year,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1782
     * month, day-of-month and day-of-week, then there is only one way to resolve a
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1783
     * date, but the parsed value for day-of-week will be cross-checked against the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1784
     * resolved date. Calling this method with the arguments {@link ChronoField#YEAR YEAR},
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1785
     * {@link ChronoField#MONTH_OF_YEAR MONTH_OF_YEAR} and
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1786
     * {@link ChronoField#DAY_OF_MONTH DAY_OF_MONTH} will ensure that the date is
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1787
     * resolved correctly, but without any cross-check for the day-of-week.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1788
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1789
     * In implementation terms, this method behaves as follows. The result of the
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1790
     * parsing phase can be considered to be a map of field to value. The behavior
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1791
     * of this method is to cause that map to be filtered between phase 1 and 2,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1792
     * removing all fields other than those specified as arguments to this method.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1793
     * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1794
     * This instance is immutable and unaffected by this method call.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1795
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1796
     * @param resolverFields  the new set of resolver fields, null if no fields
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1797
     * @return a formatter based on this formatter with the requested resolver style, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1798
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1799
    public DateTimeFormatter withResolverFields(Set<TemporalField> resolverFields) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1800
        if (Objects.equals(this.resolverFields, resolverFields)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1801
            return this;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1802
        }
23722
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1803
        if (resolverFields != null) {
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1804
            resolverFields = Collections.unmodifiableSet(new HashSet<>(resolverFields));
877a047171bb 8036818: DateTimeFormatter withResolverFields() fails to accept null
scolebourne
parents: 23573
diff changeset
  1805
        }
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
  1806
        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1807
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1808
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1809
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1810
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1811
     * Formats a date-time object using this formatter.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1812
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1813
     * This formats the date-time to a String using the rules of the formatter.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1814
     *
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1815
     * @param temporal  the temporal object to format, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1816
     * @return the formatted string, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1817
     * @throws DateTimeException if an error occurs during formatting
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1818
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1819
    public String format(TemporalAccessor temporal) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1820
        StringBuilder buf = new StringBuilder(32);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1821
        formatTo(temporal, buf);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1822
        return buf.toString();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1823
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1824
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1825
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1826
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1827
     * Formats a date-time object to an {@code Appendable} using this formatter.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1828
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1829
     * This outputs the formatted date-time to the specified destination.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1830
     * {@link Appendable} is a general purpose interface that is implemented by all
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1831
     * key character output classes including {@code StringBuffer}, {@code StringBuilder},
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1832
     * {@code PrintStream} and {@code Writer}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1833
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1834
     * Although {@code Appendable} methods throw an {@code IOException}, this method does not.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1835
     * Instead, any {@code IOException} is wrapped in a runtime exception.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1836
     *
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1837
     * @param temporal  the temporal object to format, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1838
     * @param appendable  the appendable to format to, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1839
     * @throws DateTimeException if an error occurs during formatting
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1840
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1841
    public void formatTo(TemporalAccessor temporal, Appendable appendable) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1842
        Objects.requireNonNull(temporal, "temporal");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1843
        Objects.requireNonNull(appendable, "appendable");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1844
        try {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1845
            DateTimePrintContext context = new DateTimePrintContext(temporal, this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1846
            if (appendable instanceof StringBuilder) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1847
                printerParser.format(context, (StringBuilder) appendable);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1848
            } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1849
                // buffer output to avoid writing to appendable in case of error
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1850
                StringBuilder buf = new StringBuilder(32);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1851
                printerParser.format(context, buf);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1852
                appendable.append(buf);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1853
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1854
        } catch (IOException ex) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1855
            throw new DateTimeException(ex.getMessage(), ex);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1856
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1857
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1858
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1859
    //-----------------------------------------------------------------------
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1860
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1861
     * Fully parses the text producing a temporal object.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1862
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1863
     * This parses the entire text producing a temporal object.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1864
     * It is typically more useful to use {@link #parse(CharSequence, TemporalQuery)}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1865
     * The result of this method is {@code TemporalAccessor} which has been resolved,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1866
     * applying basic validation checks to help ensure a valid date-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1867
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1868
     * If the parse completes without reading the entire length of the text,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1869
     * or a problem occurs during parsing or merging, then an exception is thrown.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1870
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1871
     * @param text  the text to parse, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1872
     * @return the parsed temporal object, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1873
     * @throws DateTimeParseException if unable to parse the requested result
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1874
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1875
    public TemporalAccessor parse(CharSequence text) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1876
        Objects.requireNonNull(text, "text");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1877
        try {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1878
            return parseResolved0(text, null);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1879
        } catch (DateTimeParseException ex) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1880
            throw ex;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1881
        } catch (RuntimeException ex) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1882
            throw createError(text, ex);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1883
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1884
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1885
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1886
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1887
     * Parses the text using this formatter, providing control over the text position.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1888
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1889
     * This parses the text without requiring the parse to start from the beginning
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1890
     * of the string or finish at the end.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1891
     * The result of this method is {@code TemporalAccessor} which has been resolved,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1892
     * applying basic validation checks to help ensure a valid date-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1893
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1894
     * The text will be parsed from the specified start {@code ParsePosition}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1895
     * The entire length of the text does not have to be parsed, the {@code ParsePosition}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1896
     * will be updated with the index at the end of parsing.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1897
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1898
     * The operation of this method is slightly different to similar methods using
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1899
     * {@code ParsePosition} on {@code java.text.Format}. That class will return
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1900
     * errors using the error index on the {@code ParsePosition}. By contrast, this
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1901
     * method will throw a {@link DateTimeParseException} if an error occurs, with
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1902
     * the exception containing the error index.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1903
     * This change in behavior is necessary due to the increased complexity of
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1904
     * parsing and resolving dates/times in this API.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1905
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1906
     * If the formatter parses the same field more than once with different values,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1907
     * the result will be an error.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1908
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1909
     * @param text  the text to parse, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1910
     * @param position  the position to parse from, updated with length parsed
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1911
     *  and the index of any error, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1912
     * @return the parsed temporal object, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1913
     * @throws DateTimeParseException if unable to parse the requested result
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1914
     * @throws IndexOutOfBoundsException if the position is invalid
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1915
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1916
    public TemporalAccessor parse(CharSequence text, ParsePosition position) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1917
        Objects.requireNonNull(text, "text");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1918
        Objects.requireNonNull(position, "position");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1919
        try {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1920
            return parseResolved0(text, position);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1921
        } catch (DateTimeParseException | IndexOutOfBoundsException ex) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1922
            throw ex;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1923
        } catch (RuntimeException ex) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1924
            throw createError(text, ex);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1925
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1926
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1927
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1928
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1929
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1930
     * Fully parses the text producing an object of the specified type.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1931
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1932
     * Most applications should use this method for parsing.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1933
     * It parses the entire text to produce the required date-time.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1934
     * The query is typically a method reference to a {@code from(TemporalAccessor)} method.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1935
     * For example:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1936
     * <pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1937
     *  LocalDateTime dt = parser.parse(str, LocalDateTime::from);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1938
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1939
     * If the parse completes without reading the entire length of the text,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1940
     * or a problem occurs during parsing or merging, then an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1941
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1942
     * @param <T> the type of the parsed date-time
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1943
     * @param text  the text to parse, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1944
     * @param query  the query defining the type to parse to, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1945
     * @return the parsed date-time, not null
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1946
     * @throws DateTimeParseException if unable to parse the requested result
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1947
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1948
    public <T> T parse(CharSequence text, TemporalQuery<T> query) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1949
        Objects.requireNonNull(text, "text");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1950
        Objects.requireNonNull(query, "query");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1951
        try {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1952
            return parseResolved0(text, null).query(query);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1953
        } catch (DateTimeParseException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1954
            throw ex;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1955
        } catch (RuntimeException ex) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1956
            throw createError(text, ex);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1957
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1958
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1959
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1960
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1961
     * Fully parses the text producing an object of one of the specified types.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1962
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1963
     * This parse method is convenient for use when the parser can handle optional elements.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1964
     * For example, a pattern of 'uuuu-MM-dd HH.mm[ VV]' can be fully parsed to a {@code ZonedDateTime},
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1965
     * or partially parsed to a {@code LocalDateTime}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1966
     * The queries must be specified in order, starting from the best matching full-parse option
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1967
     * and ending with the worst matching minimal parse option.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1968
     * The query is typically a method reference to a {@code from(TemporalAccessor)} method.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1969
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1970
     * The result is associated with the first type that successfully parses.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1971
     * Normally, applications will use {@code instanceof} to check the result.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1972
     * For example:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1973
     * <pre>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1974
     *  TemporalAccessor dt = parser.parseBest(str, ZonedDateTime::from, LocalDateTime::from);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1975
     *  if (dt instanceof ZonedDateTime) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1976
     *   ...
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1977
     *  } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1978
     *   ...
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1979
     *  }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1980
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1981
     * If the parse completes without reading the entire length of the text,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1982
     * or a problem occurs during parsing or merging, then an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1983
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1984
     * @param text  the text to parse, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1985
     * @param queries  the queries defining the types to attempt to parse to,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1986
     *  must implement {@code TemporalAccessor}, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1987
     * @return the parsed date-time, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1988
     * @throws IllegalArgumentException if less than 2 types are specified
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  1989
     * @throws DateTimeParseException if unable to parse the requested result
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1990
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1991
    public TemporalAccessor parseBest(CharSequence text, TemporalQuery<?>... queries) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1992
        Objects.requireNonNull(text, "text");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1993
        Objects.requireNonNull(queries, "queries");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1994
        if (queries.length < 2) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1995
            throw new IllegalArgumentException("At least two queries must be specified");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1996
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1997
        try {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  1998
            TemporalAccessor resolved = parseResolved0(text, null);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  1999
            for (TemporalQuery<?> query : queries) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2000
                try {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2001
                    return (TemporalAccessor) resolved.query(query);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2002
                } catch (RuntimeException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2003
                    // continue
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2004
                }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2005
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2006
            throw new DateTimeException("Unable to convert parsed text using any of the specified queries");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2007
        } catch (DateTimeParseException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2008
            throw ex;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2009
        } catch (RuntimeException ex) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2010
            throw createError(text, ex);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2011
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2012
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2013
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2014
    private DateTimeParseException createError(CharSequence text, RuntimeException ex) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2015
        String abbr;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2016
        if (text.length() > 64) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2017
            abbr = text.subSequence(0, 64).toString() + "...";
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2018
        } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2019
            abbr = text.toString();
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2020
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2021
        return new DateTimeParseException("Text '" + abbr + "' could not be parsed: " + ex.getMessage(), text, 0, ex);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2022
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2023
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2024
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2025
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2026
     * Parses and resolves the specified text.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2027
     * <p>
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2028
     * This parses to a {@code TemporalAccessor} ensuring that the text is fully parsed.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2029
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2030
     * @param text  the text to parse, not null
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2031
     * @param position  the position to parse from, updated with length parsed
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2032
     *  and the index of any error, null if parsing whole string
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2033
     * @return the resolved result of the parse, not null
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2034
     * @throws DateTimeParseException if the parse fails
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2035
     * @throws DateTimeException if an error occurs while resolving the date or time
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2036
     * @throws IndexOutOfBoundsException if the position is invalid
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2037
     */
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2038
    private TemporalAccessor parseResolved0(final CharSequence text, final ParsePosition position) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2039
        ParsePosition pos = (position != null ? position : new ParsePosition(0));
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2040
        DateTimeParseContext context = parseUnresolved0(text, pos);
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2041
        if (context == null || pos.getErrorIndex() >= 0 || (position == null && pos.getIndex() < text.length())) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2042
            String abbr;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2043
            if (text.length() > 64) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2044
                abbr = text.subSequence(0, 64).toString() + "...";
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2045
            } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2046
                abbr = text.toString();
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2047
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2048
            if (pos.getErrorIndex() >= 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2049
                throw new DateTimeParseException("Text '" + abbr + "' could not be parsed at index " +
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2050
                        pos.getErrorIndex(), text, pos.getErrorIndex());
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2051
            } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2052
                throw new DateTimeParseException("Text '" + abbr + "' could not be parsed, unparsed text found at index " +
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2053
                        pos.getIndex(), text, pos.getIndex());
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2054
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2055
        }
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2056
        return context.toResolved(resolverStyle, resolverFields);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2057
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2058
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2059
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2060
     * Parses the text using this formatter, without resolving the result, intended
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2061
     * for advanced use cases.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2062
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2063
     * Parsing is implemented as a two-phase operation.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2064
     * First, the text is parsed using the layout defined by the formatter, producing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2065
     * a {@code Map} of field to value, a {@code ZoneId} and a {@code Chronology}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2066
     * Second, the parsed data is <em>resolved</em>, by validating, combining and
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2067
     * simplifying the various fields into more useful ones.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2068
     * This method performs the parsing stage but not the resolving stage.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2069
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2070
     * The result of this method is {@code TemporalAccessor} which represents the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2071
     * data as seen in the input. Values are not validated, thus parsing a date string
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2072
     * of '2012-00-65' would result in a temporal with three fields - year of '2012',
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2073
     * month of '0' and day-of-month of '65'.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2074
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2075
     * The text will be parsed from the specified start {@code ParsePosition}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2076
     * The entire length of the text does not have to be parsed, the {@code ParsePosition}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2077
     * will be updated with the index at the end of parsing.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2078
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2079
     * Errors are returned using the error index field of the {@code ParsePosition}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2080
     * instead of {@code DateTimeParseException}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2081
     * The returned error index will be set to an index indicative of the error.
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 23722
diff changeset
  2082
     * Callers must check for errors before using the result.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2083
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2084
     * If the formatter parses the same field more than once with different values,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2085
     * the result will be an error.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2086
     * <p>
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2087
     * This method is intended for advanced use cases that need access to the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2088
     * internal state during parsing. Typical application code should use
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2089
     * {@link #parse(CharSequence, TemporalQuery)} or the parse method on the target type.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2090
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2091
     * @param text  the text to parse, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2092
     * @param position  the position to parse from, updated with length parsed
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2093
     *  and the index of any error, not null
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2094
     * @return the parsed text, null if the parse results in an error
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2095
     * @throws DateTimeException if some problem occurs during parsing
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2096
     * @throws IndexOutOfBoundsException if the position is invalid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2097
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2098
    public TemporalAccessor parseUnresolved(CharSequence text, ParsePosition position) {
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2099
        DateTimeParseContext context = parseUnresolved0(text, position);
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2100
        if (context == null) {
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2101
            return null;
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2102
        }
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2103
        return context.toUnresolved();
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2104
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2105
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2106
    private DateTimeParseContext parseUnresolved0(CharSequence text, ParsePosition position) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2107
        Objects.requireNonNull(text, "text");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2108
        Objects.requireNonNull(position, "position");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2109
        DateTimeParseContext context = new DateTimeParseContext(this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2110
        int pos = position.getIndex();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2111
        pos = printerParser.parse(context, text, pos);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2112
        if (pos < 0) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2113
            position.setErrorIndex(~pos);  // index not updated from input
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2114
            return null;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2115
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2116
        position.setIndex(pos);  // errorIndex not updated from input
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2117
        return context;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2118
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2119
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2120
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2121
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2122
     * Returns the formatter as a composite printer parser.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2123
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2124
     * @param optional  whether the printer/parser should be optional
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2125
     * @return the printer/parser, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2126
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2127
    CompositePrinterParser toPrinterParser(boolean optional) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2128
        return printerParser.withOptional(optional);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2129
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2130
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2131
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2132
     * Returns this formatter as a {@code java.text.Format} instance.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2133
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2134
     * The returned {@link Format} instance will format any {@link TemporalAccessor}
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2135
     * and parses to a resolved {@link TemporalAccessor}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2136
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2137
     * Exceptions will follow the definitions of {@code Format}, see those methods
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2138
     * for details about {@code IllegalArgumentException} during formatting and
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2139
     * {@code ParseException} or null during parsing.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2140
     * The format does not support attributing of the returned format string.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2141
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2142
     * @return this formatter as a classic format instance, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2143
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2144
    public Format toFormat() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2145
        return new ClassicFormat(this, null);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2146
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2147
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2148
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2149
     * Returns this formatter as a {@code java.text.Format} instance that will
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2150
     * parse using the specified query.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2151
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2152
     * The returned {@link Format} instance will format any {@link TemporalAccessor}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2153
     * and parses to the type specified.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2154
     * The type must be one that is supported by {@link #parse}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2155
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2156
     * Exceptions will follow the definitions of {@code Format}, see those methods
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2157
     * for details about {@code IllegalArgumentException} during formatting and
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2158
     * {@code ParseException} or null during parsing.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2159
     * The format does not support attributing of the returned format string.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2160
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2161
     * @param parseQuery  the query defining the type to parse to, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2162
     * @return this formatter as a classic format instance, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2163
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2164
    public Format toFormat(TemporalQuery<?> parseQuery) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2165
        Objects.requireNonNull(parseQuery, "parseQuery");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2166
        return new ClassicFormat(this, parseQuery);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2167
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2168
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2169
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2170
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2171
     * Returns a description of the underlying formatters.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2172
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2173
     * @return a description of this formatter, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2174
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2175
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2176
    public String toString() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2177
        String pattern = printerParser.toString();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2178
        pattern = pattern.startsWith("[") ? pattern : pattern.substring(1, pattern.length() - 1);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2179
        return pattern;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2180
        // TODO: Fix tests to not depend on toString()
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2181
//        return "DateTimeFormatter[" + locale +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2182
//                (chrono != null ? "," + chrono : "") +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2183
//                (zone != null ? "," + zone : "") +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2184
//                pattern + "]";
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2185
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2186
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2187
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2188
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2189
     * Implements the classic Java Format API.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2190
     * @serial exclude
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2191
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2192
    @SuppressWarnings("serial")  // not actually serializable
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2193
    static class ClassicFormat extends Format {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2194
        /** The formatter. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2195
        private final DateTimeFormatter formatter;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2196
        /** The type to be parsed. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2197
        private final TemporalQuery<?> parseType;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2198
        /** Constructor. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2199
        public ClassicFormat(DateTimeFormatter formatter, TemporalQuery<?> parseType) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2200
            this.formatter = formatter;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2201
            this.parseType = parseType;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2202
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2203
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2204
        @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2205
        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2206
            Objects.requireNonNull(obj, "obj");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2207
            Objects.requireNonNull(toAppendTo, "toAppendTo");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2208
            Objects.requireNonNull(pos, "pos");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2209
            if (obj instanceof TemporalAccessor == false) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2210
                throw new IllegalArgumentException("Format target must implement TemporalAccessor");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2211
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2212
            pos.setBeginIndex(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2213
            pos.setEndIndex(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2214
            try {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2215
                formatter.formatTo((TemporalAccessor) obj, toAppendTo);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2216
            } catch (RuntimeException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2217
                throw new IllegalArgumentException(ex.getMessage(), ex);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2218
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2219
            return toAppendTo;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2220
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2221
        @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2222
        public Object parseObject(String text) throws ParseException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2223
            Objects.requireNonNull(text, "text");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2224
            try {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2225
                if (parseType == null) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2226
                    return formatter.parseResolved0(text, null);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2227
                }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2228
                return formatter.parse(text, parseType);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2229
            } catch (DateTimeParseException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2230
                throw new ParseException(ex.getMessage(), ex.getErrorIndex());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2231
            } catch (RuntimeException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2232
                throw (ParseException) new ParseException(ex.getMessage(), 0).initCause(ex);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2233
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2234
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2235
        @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2236
        public Object parseObject(String text, ParsePosition pos) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2237
            Objects.requireNonNull(text, "text");
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2238
            DateTimeParseContext context;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2239
            try {
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2240
                context = formatter.parseUnresolved0(text, pos);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2241
            } catch (IndexOutOfBoundsException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2242
                if (pos.getErrorIndex() < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2243
                    pos.setErrorIndex(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2244
                }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2245
                return null;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2246
            }
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2247
            if (context == null) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2248
                if (pos.getErrorIndex() < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2249
                    pos.setErrorIndex(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2250
                }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2251
                return null;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2252
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2253
            try {
23573
f42dcef4fb7f 8033662: DateTimeFormatter parsing ignores withZone()
sherman
parents: 22654
diff changeset
  2254
                TemporalAccessor resolved = context.toResolved(formatter.resolverStyle, formatter.resolverFields);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2255
                if (parseType == null) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2256
                    return resolved;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
  2257
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
  2258
                return resolved.query(parseType);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2259
            } catch (RuntimeException ex) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2260
                pos.setErrorIndex(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2261
                return null;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2262
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2263
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2264
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2265
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
  2266
}