1c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/*
2c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
3c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
5c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is free software; you can redistribute it and/or modify it
6c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * under the terms of the GNU General Public License version 2 only, as
7c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * published by the Free Software Foundation.  Oracle designates this
8c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * particular file as subject to the "Classpath" exception as provided
9c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * by Oracle in the LICENSE file that accompanied this code.
10c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
11c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is distributed in the hope that it will be useful, but WITHOUT
12c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * version 2 for more details (a copy is included in the LICENSE file that
15c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * accompanied this code).
16c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
17c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * You should have received a copy of the GNU General Public License version
18c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 2 along with this work; if not, write to the Free Software Foundation,
19c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
21c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * or visit www.oracle.com if you need additional information or have any
23c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * questions.
24c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
25c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
26c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/*
27c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This file is available under and governed by the GNU General Public
28c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * License version 2 only, as published by the Free Software Foundation.
29c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * However, the following notice accompanied the original version of this
30c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * file:
31c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
32c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2007-2012, Stephen Colebourne & Michael Nascimento Santos
33c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
34c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * All rights reserved.
35c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
36c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Redistribution and use in source and binary forms, with or without
37c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * modification, are permitted provided that the following conditions are met:
38c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
39c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Redistributions of source code must retain the above copyright notice,
40c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    this list of conditions and the following disclaimer.
41c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
42c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Redistributions in binary form must reproduce the above copyright notice,
43c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    this list of conditions and the following disclaimer in the documentation
44c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    and/or other materials provided with the distribution.
45c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
46c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Neither the name of JSR-310 nor the names of its contributors
47c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    may be used to endorse or promote products derived from this software
48c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    without specific prior written permission.
49c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
50c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
54c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
55c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
56c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
57c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
58c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
59c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
60c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
62c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpackage java.time;
63c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
64c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.HOURS_PER_DAY;
65c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.MICROS_PER_DAY;
66c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.MILLIS_PER_DAY;
67c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.MINUTES_PER_DAY;
68c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.NANOS_PER_DAY;
69c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.NANOS_PER_HOUR;
70c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.NANOS_PER_MINUTE;
71c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.NANOS_PER_SECOND;
72c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.LocalTime.SECONDS_PER_DAY;
73c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.NANO_OF_SECOND;
74c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
75c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.DataInput;
76c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.DataOutput;
77c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.IOException;
78c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.InvalidObjectException;
79c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.ObjectInputStream;
80c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.Serializable;
81c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.chrono.ChronoLocalDateTime;
82c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.format.DateTimeFormatter;
83c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.format.DateTimeParseException;
84c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.ChronoField;
85c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.ChronoUnit;
86c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.Temporal;
87c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAccessor;
88c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAdjuster;
89c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAmount;
90c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalField;
91c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalQueries;
92c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalQuery;
93c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalUnit;
94c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.UnsupportedTemporalTypeException;
95c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.ValueRange;
96c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.zone.ZoneRules;
97c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.util.Objects;
98c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
9969fc4ab478c65571e31c4156c4cff998cef4ececPrzemyslaw Szczepaniak// Android-changed: removed ValueBased paragraph.
100c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/**
101c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A date-time without a time-zone in the ISO-8601 calendar system,
102c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * such as {@code 2007-12-03T10:15:30}.
103c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p>
104c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * {@code LocalDateTime} is an immutable date-time object that represents a date-time,
105c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * often viewed as year-month-day-hour-minute-second. Other date and time fields,
106c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * such as day-of-year, day-of-week and week-of-year, can also be accessed.
107c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Time is represented to nanosecond precision.
108c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * For example, the value "2nd October 2007 at 13:45.30.123456789" can be
109c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * stored in a {@code LocalDateTime}.
110c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p>
111c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This class does not store or represent a time-zone.
112c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Instead, it is a description of the date, as used for birthdays, combined with
113c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * the local time as seen on a wall clock.
114c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * It cannot represent an instant on the time-line without additional information
115c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * such as an offset or time-zone.
116c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p>
117c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The ISO-8601 calendar system is the modern civil calendar system used today
118c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * in most of the world. It is equivalent to the proleptic Gregorian calendar
119c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * system, in which today's rules for leap years are applied for all time.
120c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * For most applications written today, the ISO-8601 rules are entirely suitable.
121c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * However, any application that makes use of historical dates, and requires them
122c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * to be accurate will find the ISO-8601 approach unsuitable.
123c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
124c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @implSpec
125c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This class is immutable and thread-safe.
126c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
127c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @since 1.8
128c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
129c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpublic final class LocalDateTime
130c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable {
131c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
132c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
133c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The minimum supported {@code LocalDateTime}, '-999999999-01-01T00:00:00'.
134c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is the local date-time of midnight at the start of the minimum date.
135c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This combines {@link LocalDate#MIN} and {@link LocalTime#MIN}.
136c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This could be used by an application as a "far past" date-time.
137c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
138c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static final LocalDateTime MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);
139c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
140c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The maximum supported {@code LocalDateTime}, '+999999999-12-31T23:59:59.999999999'.
141c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is the local date-time just before midnight at the end of the maximum date.
142c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This combines {@link LocalDate#MAX} and {@link LocalTime#MAX}.
143c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This could be used by an application as a "far future" date-time.
144c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
145c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static final LocalDateTime MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);
146c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
147c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
148c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Serialization version.
149c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
150c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private static final long serialVersionUID = 6207766400415563566L;
151c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
152c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
153c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The date part.
154c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
155c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private final LocalDate date;
156c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
157c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The time part.
158c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
159c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private final LocalTime time;
160c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
161c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
162c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
163c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains the current date-time from the system clock in the default time-zone.
164c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
165c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This will query the {@link Clock#systemDefaultZone() system clock} in the default
166c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * time-zone to obtain the current date-time.
167c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
168c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Using this method will prevent the ability to use an alternate clock for testing
169c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * because the clock is hard-coded.
170c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
171c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the current date-time using the system clock and default time-zone, not null
172c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
173c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime now() {
174c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return now(Clock.systemDefaultZone());
175c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
176c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
177c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
178c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains the current date-time from the system clock in the specified time-zone.
179c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
180c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This will query the {@link Clock#system(ZoneId) system clock} to obtain the current date-time.
181c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Specifying the time-zone avoids dependence on the default time-zone.
182c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
183c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Using this method will prevent the ability to use an alternate clock for testing
184c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * because the clock is hard-coded.
185c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
186c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param zone  the zone ID to use, not null
187c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the current date-time using the system clock, not null
188c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
189c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime now(ZoneId zone) {
190c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return now(Clock.system(zone));
191c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
192c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
193c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
194c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains the current date-time from the specified clock.
195c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
196c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This will query the specified clock to obtain the current date-time.
197c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Using this method allows the use of an alternate clock for testing.
198c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The alternate clock may be introduced using {@link Clock dependency injection}.
199c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
200c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param clock  the clock to use, not null
201c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the current date-time, not null
202c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
203c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime now(Clock clock) {
204c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(clock, "clock");
205c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        final Instant now = clock.instant();  // called once
206c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ZoneOffset offset = clock.getZone().getRules().getOffset(now);
207c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ofEpochSecond(now.getEpochSecond(), now.getNano(), offset);
208c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
209c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
210c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
211c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
212c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
213c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour and minute, setting the second and nanosecond to zero.
214c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
215c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
216c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour and minute.
217c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
218c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The second and nanosecond fields will be set to zero.
219c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
220c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
221c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, not null
222c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
223c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
224c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
225c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
226c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
227c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
228c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
229c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute) {
230c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
231c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute);
232c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
233c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
234c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
235c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
236c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
237c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour, minute and second, setting the nanosecond to zero.
238c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
239c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
240c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour, minute and second.
241c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
242c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The nanosecond field will be set to zero.
243c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
244c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
245c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, not null
246c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
247c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
248c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
249c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param second  the second-of-minute to represent, from 0 to 59
250c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
251c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
252c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
253c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
254c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) {
255c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
256c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute, second);
257c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
258c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
259c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
260c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
261c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
262c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour, minute, second and nanosecond.
263c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
264c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
265c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour, minute, second and nanosecond.
266c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
267c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
268c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
269c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, not null
270c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
271c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
272c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
273c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param second  the second-of-minute to represent, from 0 to 59
274c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanoOfSecond  the nano-of-second to represent, from 0 to 999,999,999
275c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
276c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
277c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
278c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
279c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
280c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
281c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute, second, nanoOfSecond);
282c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
283c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
284c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
285c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
286c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
287c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
288c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour and minute, setting the second and nanosecond to zero.
289c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
290c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
291c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour and minute.
292c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
293c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The second and nanosecond fields will be set to zero.
294c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
295c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
296c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, from 1 (January) to 12 (December)
297c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
298c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
299c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
300c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
301c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
302c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
303c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
304c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute) {
305c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
306c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute);
307c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
308c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
309c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
310c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
311c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
312c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour, minute and second, setting the nanosecond to zero.
313c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
314c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
315c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour, minute and second.
316c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
317c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The nanosecond field will be set to zero.
318c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
319c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
320c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, from 1 (January) to 12 (December)
321c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
322c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
323c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
324c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param second  the second-of-minute to represent, from 0 to 59
325c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
326c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
327c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
328c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
329c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second) {
330c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
331c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute, second);
332c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
333c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
334c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
335c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
336c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from year, month,
337c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day, hour, minute, second and nanosecond.
338c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
339c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime} with the specified year, month,
340c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * day-of-month, hour, minute, second and nanosecond.
341c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The day must be valid for the year and month, otherwise an exception will be thrown.
342c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
343c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to represent, from MIN_YEAR to MAX_YEAR
344c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to represent, from 1 (January) to 12 (December)
345c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to represent, from 1 to 31
346c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to represent, from 0 to 23
347c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to represent, from 0 to 59
348c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param second  the second-of-minute to represent, from 0 to 59
349c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanoOfSecond  the nano-of-second to represent, from 0 to 999,999,999
350c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
351c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the value of any field is out of range,
352c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
353c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
354c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
355c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.of(year, month, dayOfMonth);
356c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.of(hour, minute, second, nanoOfSecond);
357c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
358c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
359c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
360c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
361c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from a date and time.
362c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
363c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param date  the local date, not null
364c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param time  the local time, not null
365c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
366c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
367c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime of(LocalDate date, LocalTime time) {
368c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(date, "date");
369c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(time, "time");
370c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
371c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
372c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
373c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-------------------------------------------------------------------------
374c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
375c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from an {@code Instant} and zone ID.
376c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
377c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This creates a local date-time based on the specified instant.
378c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * First, the offset from UTC/Greenwich is obtained using the zone ID and instant,
379c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * which is simple as there is only one valid offset for each instant.
380c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Then, the instant and offset are used to calculate the local date-time.
381c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
382c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param instant  the instant to create the date-time from, not null
383c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param zone  the time-zone, which may be an offset, not null
384c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
385c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported range
386c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
387c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime ofInstant(Instant instant, ZoneId zone) {
388c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(instant, "instant");
389c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(zone, "zone");
390c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ZoneRules rules = zone.getRules();
391c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ZoneOffset offset = rules.getOffset(instant);
392c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ofEpochSecond(instant.getEpochSecond(), instant.getNano(), offset);
393c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
394c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
395c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
396c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} using seconds from the
397c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * epoch of 1970-01-01T00:00:00Z.
398c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
399c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This allows the {@link ChronoField#INSTANT_SECONDS epoch-second} field
400c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * to be converted to a local date-time. This is primarily intended for
401c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * low-level conversions rather than general application usage.
402c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
403c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param epochSecond  the number of seconds from the epoch of 1970-01-01T00:00:00Z
404c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanoOfSecond  the nanosecond within the second, from 0 to 999,999,999
405c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param offset  the zone offset, not null
406c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
407c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported range,
408c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the nano-of-second is invalid
409c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
410c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset) {
411c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(offset, "offset");
412c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        NANO_OF_SECOND.checkValidValue(nanoOfSecond);
413c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long localSecond = epochSecond + offset.getTotalSeconds();  // overflow caught later
414c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long localEpochDay = Math.floorDiv(localSecond, SECONDS_PER_DAY);
415c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int secsOfDay = (int)Math.floorMod(localSecond, SECONDS_PER_DAY);
416c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.ofEpochDay(localEpochDay);
417c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.ofNanoOfDay(secsOfDay * NANOS_PER_SECOND + nanoOfSecond);
418c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(date, time);
419c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
420c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
421c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
422c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
423c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from a temporal object.
424c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
425c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This obtains a local date-time based on the specified temporal.
426c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * A {@code TemporalAccessor} represents an arbitrary set of date and time information,
427c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * which this factory converts to an instance of {@code LocalDateTime}.
428c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
429c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The conversion extracts and combines the {@code LocalDate} and the
430c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code LocalTime} from the temporal object.
431c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Implementations are permitted to perform optimizations such as accessing
432c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * those fields that are equivalent to the relevant objects.
433c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
434c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method matches the signature of the functional interface {@link TemporalQuery}
435c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * allowing it to be used as a query via method reference, {@code LocalDateTime::from}.
436c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
437c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param temporal  the temporal object to convert, not null
438c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the local date-time, not null
439c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if unable to convert to a {@code LocalDateTime}
440c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
441c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime from(TemporalAccessor temporal) {
442c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (temporal instanceof LocalDateTime) {
443c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (LocalDateTime) temporal;
444c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else if (temporal instanceof ZonedDateTime) {
445c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return ((ZonedDateTime) temporal).toLocalDateTime();
446c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else if (temporal instanceof OffsetDateTime) {
447c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return ((OffsetDateTime) temporal).toLocalDateTime();
448c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
449c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        try {
450c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            LocalDate date = LocalDate.from(temporal);
451c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            LocalTime time = LocalTime.from(temporal);
452c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return new LocalDateTime(date, time);
453c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } catch (DateTimeException ex) {
454c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            throw new DateTimeException("Unable to obtain LocalDateTime from TemporalAccessor: " +
455c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    temporal + " of type " + temporal.getClass().getName(), ex);
456c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
457c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
458c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
459c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
460c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
461c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from a text string such as {@code 2007-12-03T10:15:30}.
462c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
463c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The string must represent a valid date-time and is parsed using
464c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link java.time.format.DateTimeFormatter#ISO_LOCAL_DATE_TIME}.
465c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
466c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param text  the text to parse such as "2007-12-03T10:15:30", not null
467c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the parsed local date-time, not null
468c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeParseException if the text cannot be parsed
469c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
470c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime parse(CharSequence text) {
471c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return parse(text, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
472c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
473c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
474c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
475c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Obtains an instance of {@code LocalDateTime} from a text string using a specific formatter.
476c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
477c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The text is parsed using the formatter, returning a date-time.
478c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
479c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param text  the text to parse, not null
480c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param formatter  the formatter to use, not null
481c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the parsed local date-time, not null
482c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeParseException if the text cannot be parsed
483c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
484c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) {
485c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(formatter, "formatter");
486c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return formatter.parse(text, LocalDateTime::from);
487c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
488c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
489c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
490c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
491c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Constructor.
492c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
493c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param date  the date part of the date-time, validated not null
494c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param time  the time part of the date-time, validated not null
495c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
496c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private LocalDateTime(LocalDate date, LocalTime time) {
497c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        this.date = date;
498c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        this.time = time;
499c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
500c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
501c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
502c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the new date and time, checking
503c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * to see if a new object is in fact required.
504c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
505c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param newDate  the date of the new date-time, not null
506c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param newTime  the time of the new date-time, not null
507c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the date-time, not null
508c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
509c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private LocalDateTime with(LocalDate newDate, LocalTime newTime) {
510c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (date == newDate && time == newTime) {
511c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return this;
512c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
513c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new LocalDateTime(newDate, newTime);
514c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
515c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
516c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
517c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
518c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if the specified field is supported.
519c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
520c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This checks if this date-time can be queried for the specified field.
521c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If false, then calling the {@link #range(TemporalField) range},
522c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)}
523c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * methods will throw an exception.
524c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
525c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoField} then the query is implemented here.
526c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The supported fields are:
527c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ul>
528c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code NANO_OF_SECOND}
529c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code NANO_OF_DAY}
530c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MICRO_OF_SECOND}
531c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MICRO_OF_DAY}
532c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MILLI_OF_SECOND}
533c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MILLI_OF_DAY}
534c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code SECOND_OF_MINUTE}
535c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code SECOND_OF_DAY}
536c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MINUTE_OF_HOUR}
537c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MINUTE_OF_DAY}
538c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code HOUR_OF_AMPM}
539c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code CLOCK_HOUR_OF_AMPM}
540c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code HOUR_OF_DAY}
541c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code CLOCK_HOUR_OF_DAY}
542c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code AMPM_OF_DAY}
543c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code DAY_OF_WEEK}
544c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ALIGNED_DAY_OF_WEEK_IN_MONTH}
545c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ALIGNED_DAY_OF_WEEK_IN_YEAR}
546c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code DAY_OF_MONTH}
547c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code DAY_OF_YEAR}
548c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code EPOCH_DAY}
549c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ALIGNED_WEEK_OF_MONTH}
550c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ALIGNED_WEEK_OF_YEAR}
551c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MONTH_OF_YEAR}
552c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code PROLEPTIC_MONTH}
553c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code YEAR_OF_ERA}
554c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code YEAR}
555c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ERA}
556c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ul>
557c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoField} instances will return false.
558c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
559c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoField}, then the result of this method
560c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)}
561c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument.
562c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Whether the field is supported is determined by the field.
563c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
564c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param field  the field to check, null returns false
565c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if the field is supported on this date-time, false if not
566c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
567c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
568c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean isSupported(TemporalField field) {
569c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (field instanceof ChronoField) {
570c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoField f = (ChronoField) field;
571c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return f.isDateBased() || f.isTimeBased();
572c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
573c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return field != null && field.isSupportedBy(this);
574c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
575c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
576c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
577c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if the specified unit is supported.
578c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
579c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This checks if the specified unit can be added to, or subtracted from, this date-time.
580c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If false, then calling the {@link #plus(long, TemporalUnit)} and
581c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link #minus(long, TemporalUnit) minus} methods will throw an exception.
582c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
583c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the unit is a {@link ChronoUnit} then the query is implemented here.
584c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The supported units are:
585c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ul>
586c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code NANOS}
587c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MICROS}
588c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MILLIS}
589c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code SECONDS}
590c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MINUTES}
591c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code HOURS}
592c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code HALF_DAYS}
593c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code DAYS}
594c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code WEEKS}
595c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MONTHS}
596c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code YEARS}
597c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code DECADES}
598c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code CENTURIES}
599c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code MILLENNIA}
600c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code ERAS}
601c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ul>
602c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoUnit} instances will return false.
603c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
604c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the unit is not a {@code ChronoUnit}, then the result of this method
605c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)}
606c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument.
607c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Whether the unit is supported is determined by the unit.
608c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
609c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param unit  the unit to check, null returns false
610c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if the unit can be added/subtracted, false if not
611c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
612c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc
613c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean isSupported(TemporalUnit unit) {
614c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.isSupported(unit);
615c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
616c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
617c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
618c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
619c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the range of valid values for the specified field.
620c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
621c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The range object expresses the minimum and maximum valid values for a field.
622c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This date-time is used to enhance the accuracy of the returned range.
623c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If it is not possible to return the range, because the field is not supported
624c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * or for some other reason, an exception is thrown.
625c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
626c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoField} then the query is implemented here.
627c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@link #isSupported(TemporalField) supported fields} will return
628c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * appropriate range instances.
629c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
630c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
631c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoField}, then the result of this method
632c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalField.rangeRefinedBy(TemporalAccessor)}
633c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument.
634c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Whether the range can be obtained is determined by the field.
635c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
636c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param field  the field to query the range for, not null
637c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the range of valid values for the field, not null
638c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the range for the field cannot be obtained
639c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the field is not supported
640c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
641c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
642c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public ValueRange range(TemporalField field) {
643c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (field instanceof ChronoField) {
644c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoField f = (ChronoField) field;
645c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (f.isTimeBased() ? time.range(field) : date.range(field));
646c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
647c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return field.rangeRefinedBy(this);
648c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
649c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
650c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
651c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the value of the specified field from this date-time as an {@code int}.
652c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
653c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This queries this date-time for the value of the specified field.
654c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The returned value will always be within the valid range of values for the field.
655c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If it is not possible to return the value, because the field is not supported
656c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * or for some other reason, an exception is thrown.
657c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
658c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoField} then the query is implemented here.
659c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@link #isSupported(TemporalField) supported fields} will return valid
660c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * values based on this date-time, except {@code NANO_OF_DAY}, {@code MICRO_OF_DAY},
661c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code EPOCH_DAY} and {@code PROLEPTIC_MONTH} which are too large to fit in
662c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * an {@code int} and throw a {@code DateTimeException}.
663c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
664c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
665c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoField}, then the result of this method
666c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
667c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument. Whether the value can be obtained,
668c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * and what the value represents, is determined by the field.
669c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
670c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param field  the field to get, not null
671c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the value for the field
672c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if a value for the field cannot be obtained or
673c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *         the value is outside the range of valid values for the field
674c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the field is not supported or
675c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *         the range of values exceeds an {@code int}
676c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
677c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
678c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
679c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int get(TemporalField field) {
680c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (field instanceof ChronoField) {
681c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoField f = (ChronoField) field;
682c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (f.isTimeBased() ? time.get(field) : date.get(field));
683c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
684c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.get(field);
685c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
686c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
687c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
688c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the value of the specified field from this date-time as a {@code long}.
689c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
690c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This queries this date-time for the value of the specified field.
691c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If it is not possible to return the value, because the field is not supported
692c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * or for some other reason, an exception is thrown.
693c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
694c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoField} then the query is implemented here.
695c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@link #isSupported(TemporalField) supported fields} will return valid
696c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * values based on this date-time.
697c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
698c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
699c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoField}, then the result of this method
700c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
701c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument. Whether the value can be obtained,
702c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * and what the value represents, is determined by the field.
703c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
704c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param field  the field to get, not null
705c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the value for the field
706c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if a value for the field cannot be obtained
707c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the field is not supported
708c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
709c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
710c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
711c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public long getLong(TemporalField field) {
712c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (field instanceof ChronoField) {
713c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoField f = (ChronoField) field;
714c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (f.isTimeBased() ? time.getLong(field) : date.getLong(field));
715c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
716c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return field.getFrom(this);
717c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
718c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
719c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
720c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
721c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the {@code LocalDate} part of this date-time.
722c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
723c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDate} with the same year, month and day
724c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * as this date-time.
725c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
726c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the date part of this date-time, not null
727c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
728c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
729c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDate toLocalDate() {
730c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date;
731c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
732c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
733c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
734c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the year field.
735c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
736c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the primitive {@code int} value for the year.
737c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
738c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The year returned by this method is proleptic as per {@code get(YEAR)}.
739c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * To obtain the year-of-era, use {@code get(YEAR_OF_ERA)}.
740c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
741c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the year, from MIN_YEAR to MAX_YEAR
742c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
743c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getYear() {
744c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getYear();
745c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
746c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
747c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
748c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the month-of-year field from 1 to 12.
749c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
750c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the month as an {@code int} from 1 to 12.
751c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Application code is frequently clearer if the enum {@link Month}
752c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is used by calling {@link #getMonth()}.
753c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
754c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the month-of-year, from 1 to 12
755c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @see #getMonth()
756c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
757c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getMonthValue() {
758c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getMonthValue();
759c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
760c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
761c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
762c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the month-of-year field using the {@code Month} enum.
763c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
764c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the enum {@link Month} for the month.
765c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This avoids confusion as to what {@code int} values mean.
766c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If you need access to the primitive {@code int} value then the enum
767c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * provides the {@link Month#getValue() int value}.
768c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
769c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the month-of-year, not null
770c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @see #getMonthValue()
771c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
772c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public Month getMonth() {
773c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getMonth();
774c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
775c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
776c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
777c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the day-of-month field.
778c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
779c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the primitive {@code int} value for the day-of-month.
780c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
781c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the day-of-month, from 1 to 31
782c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
783c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getDayOfMonth() {
784c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getDayOfMonth();
785c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
786c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
787c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
788c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the day-of-year field.
789c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
790c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the primitive {@code int} value for the day-of-year.
791c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
792c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the day-of-year, from 1 to 365, or 366 in a leap year
793c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
794c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getDayOfYear() {
795c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getDayOfYear();
796c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
797c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
798c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
799c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the day-of-week field, which is an enum {@code DayOfWeek}.
800c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
801c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method returns the enum {@link DayOfWeek} for the day-of-week.
802c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This avoids confusion as to what {@code int} values mean.
803c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If you need access to the primitive {@code int} value then the enum
804c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * provides the {@link DayOfWeek#getValue() int value}.
805c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
806c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Additional information can be obtained from the {@code DayOfWeek}.
807c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This includes textual names of the values.
808c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
809c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the day-of-week, not null
810c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
811c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public DayOfWeek getDayOfWeek() {
812c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.getDayOfWeek();
813c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
814c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
815c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
816c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
817c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the {@code LocalTime} part of this date-time.
818c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
819c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalTime} with the same hour, minute, second and
820c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * nanosecond as this date-time.
821c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
822c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the time part of this date-time, not null
823c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
824c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
825c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalTime toLocalTime() {
826c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return time;
827c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
828c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
829c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
830c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the hour-of-day field.
831c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
832c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the hour-of-day, from 0 to 23
833c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
834c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getHour() {
835c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return time.getHour();
836c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
837c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
838c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
839c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the minute-of-hour field.
840c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
841c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the minute-of-hour, from 0 to 59
842c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
843c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getMinute() {
844c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return time.getMinute();
845c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
846c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
847c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
848c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the second-of-minute field.
849c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
850c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the second-of-minute, from 0 to 59
851c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
852c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getSecond() {
853c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return time.getSecond();
854c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
855c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
856c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
857c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Gets the nano-of-second field.
858c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
859c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the nano-of-second, from 0 to 999,999,999
860c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
861c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int getNano() {
862c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return time.getNano();
863c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
864c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
865c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
866c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
867c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns an adjusted copy of this date-time.
868c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
869c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the date-time adjusted.
870c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The adjustment takes place using the specified adjuster strategy object.
871c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Read the documentation of the adjuster to understand what adjustment will be made.
872c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
873c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * A simple adjuster might simply set the one of the fields, such as the year field.
874c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * A more complex adjuster might set the date to the last day of the month.
875c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
876c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * A selection of common adjustments is provided in
877c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link java.time.temporal.TemporalAdjusters TemporalAdjusters}.
878c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * These include finding the "last day of the month" and "next Wednesday".
879c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Key date-time classes also implement the {@code TemporalAdjuster} interface,
880c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * such as {@link Month} and {@link java.time.MonthDay MonthDay}.
881c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The adjuster is responsible for handling special cases, such as the varying
882c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * lengths of month and leap years.
883c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
884c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example this code returns a date on the last day of July:
885c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
886c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  import static java.time.Month.*;
887c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  import static java.time.temporal.TemporalAdjusters.*;
888c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
889c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  result = localDateTime.with(JULY).with(lastDayOfMonth());
890c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
891c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
892c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The classes {@link LocalDate} and {@link LocalTime} implement {@code TemporalAdjuster},
893c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * thus this method can be used to change the date, time or offset:
894c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
895c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  result = localDateTime.with(date);
896c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  result = localDateTime.with(time);
897c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
898c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
899c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result of this method is obtained by invoking the
900c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link TemporalAdjuster#adjustInto(Temporal)} method on the
901c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * specified adjuster passing {@code this} as the argument.
902c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
903c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
904c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
905c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param adjuster the adjuster to use, not null
906c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on {@code this} with the adjustment made, not null
907c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the adjustment cannot be made
908c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
909c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
910c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
911c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime with(TemporalAdjuster adjuster) {
912c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        // optimizations
913c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (adjuster instanceof LocalDate) {
914c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with((LocalDate) adjuster, time);
915c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else if (adjuster instanceof LocalTime) {
916c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with(date, (LocalTime) adjuster);
917c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else if (adjuster instanceof LocalDateTime) {
918c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (LocalDateTime) adjuster;
919c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
920c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (LocalDateTime) adjuster.adjustInto(this);
921c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
922c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
923c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
924c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the specified field set to a new value.
925c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
926c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the value
927c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * for the specified field changed.
928c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This can be used to change any supported field, such as the year, month or day-of-month.
929c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If it is not possible to set the value, because the field is not supported or for
930c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * some other reason, an exception is thrown.
931c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
932c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In some cases, changing the specified field can cause the resulting date-time to become invalid,
933c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * such as changing the month from 31st January to February would make the day-of-month invalid.
934c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In cases like this, the field is responsible for resolving the date. Typically it will choose
935c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * the previous valid date, which would be the last valid day of February in this example.
936c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
937c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoField} then the adjustment is implemented here.
938c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@link #isSupported(TemporalField) supported fields} will behave as per
939c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * the matching method on {@link LocalDate#with(TemporalField, long) LocalDate}
940c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * or {@link LocalTime#with(TemporalField, long) LocalTime}.
941c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
942c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
943c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoField}, then the result of this method
944c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalField.adjustInto(Temporal, long)}
945c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument. In this case, the field determines
946c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * whether and how to adjust the instant.
947c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
948c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
949c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
950c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param field  the field to set in the result, not null
951c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param newValue  the new value of the field in the result
952c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on {@code this} with the specified field set, not null
953c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the field cannot be set
954c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the field is not supported
955c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
956c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
957c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
958c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime with(TemporalField field, long newValue) {
959c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (field instanceof ChronoField) {
960c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoField f = (ChronoField) field;
961c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            if (f.isTimeBased()) {
962c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                return with(date, time.with(field, newValue));
963c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            } else {
964c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                return with(date.with(field, newValue), time);
965c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            }
966c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
967c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return field.adjustInto(this, newValue);
968c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
969c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
970c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
971c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
972c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the year altered.
973c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
974c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The time does not affect the calculation and will be the same in the result.
975c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
976c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
977c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
978c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
979c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param year  the year to set in the result, from MIN_YEAR to MAX_YEAR
980c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested year, not null
981c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the year value is invalid
982c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
983c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withYear(int year) {
984c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date.withYear(year), time);
985c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
986c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
987c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
988c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the month-of-year altered.
989c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
990c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The time does not affect the calculation and will be the same in the result.
991c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
992c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
993c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
994c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
995c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param month  the month-of-year to set in the result, from 1 (January) to 12 (December)
996c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested month, not null
997c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the month-of-year value is invalid
998c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
999c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withMonth(int month) {
1000c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date.withMonth(month), time);
1001c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1002c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1003c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1004c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the day-of-month altered.
1005c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1006c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the resulting date-time is invalid, an exception is thrown.
1007c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The time does not affect the calculation and will be the same in the result.
1008c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1009c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1010c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1011c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfMonth  the day-of-month to set in the result, from 1 to 28-31
1012c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested day, not null
1013c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the day-of-month value is invalid,
1014c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-month is invalid for the month-year
1015c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1016c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withDayOfMonth(int dayOfMonth) {
1017c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date.withDayOfMonth(dayOfMonth), time);
1018c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1019c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1020c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1021c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the day-of-year altered.
1022c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1023c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the resulting date-time is invalid, an exception is thrown.
1024c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1025c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1026c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1027c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param dayOfYear  the day-of-year to set in the result, from 1 to 365-366
1028c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date with the requested day, not null
1029c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the day-of-year value is invalid,
1030c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  or if the day-of-year is invalid for the year
1031c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1032c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withDayOfYear(int dayOfYear) {
1033c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date.withDayOfYear(dayOfYear), time);
1034c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1035c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1036c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1037c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1038c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the hour-of-day altered.
1039c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1040c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1041c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1042c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hour  the hour-of-day to set in the result, from 0 to 23
1043c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested hour, not null
1044c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the hour value is invalid
1045c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1046c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withHour(int hour) {
1047c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime newTime = time.withHour(hour);
1048c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date, newTime);
1049c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1050c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1051c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1052c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the minute-of-hour altered.
1053c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1054c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1055c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1056c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minute  the minute-of-hour to set in the result, from 0 to 59
1057c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested minute, not null
1058c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the minute value is invalid
1059c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1060c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withMinute(int minute) {
1061c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime newTime = time.withMinute(minute);
1062c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date, newTime);
1063c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1064c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1065c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1066c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the second-of-minute altered.
1067c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1068c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1069c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1070c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param second  the second-of-minute to set in the result, from 0 to 59
1071c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested second, not null
1072c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the second value is invalid
1073c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1074c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withSecond(int second) {
1075c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime newTime = time.withSecond(second);
1076c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date, newTime);
1077c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1078c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1079c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1080c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the nano-of-second altered.
1081c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1082c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1083c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1084c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanoOfSecond  the nano-of-second to set in the result, from 0 to 999,999,999
1085c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the requested nanosecond, not null
1086c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the nano value is invalid
1087c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1088c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime withNano(int nanoOfSecond) {
1089c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime newTime = time.withNano(nanoOfSecond);
1090c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date, newTime);
1091c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1092c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1093c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1094c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1095c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the time truncated.
1096c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1097c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Truncation returns a copy of the original date-time with fields
1098c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * smaller than the specified unit set to zero.
1099c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, truncating with the {@link ChronoUnit#MINUTES minutes} unit
1100c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * will set the second-of-minute and nano-of-second field to zero.
1101c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1102c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The unit must have a {@linkplain TemporalUnit#getDuration() duration}
1103c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * that divides into the length of a standard day without remainder.
1104c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This includes all supplied time units on {@link ChronoUnit} and
1105c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link ChronoUnit#DAYS DAYS}. Other units throw an exception.
1106c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1107c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1108c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1109c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param unit  the unit to truncate to, not null
1110c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the time truncated, not null
1111c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if unable to truncate
1112c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the unit is not supported
1113c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1114c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime truncatedTo(TemporalUnit unit) {
1115c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(date, time.truncatedTo(unit));
1116c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1117c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1118c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1119c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1120c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the specified amount added.
1121c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1122c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the specified amount added.
1123c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The amount is typically {@link Period} or {@link Duration} but may be
1124c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * any other type implementing the {@link TemporalAmount} interface.
1125c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1126c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The calculation is delegated to the amount object by calling
1127c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link TemporalAmount#addTo(Temporal)}. The amount implementation is free
1128c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * to implement the addition in any way it wishes, however it typically
1129c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * calls back to {@link #plus(long, TemporalUnit)}. Consult the documentation
1130c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * of the amount implementation to determine if it can be successfully added.
1131c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1132c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1133c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1134c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param amountToAdd  the amount to add, not null
1135c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the addition made, not null
1136c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the addition cannot be made
1137c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1138c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1139c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1140c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plus(TemporalAmount amountToAdd) {
1141c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (amountToAdd instanceof Period) {
1142c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            Period periodToAdd = (Period) amountToAdd;
1143c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with(date.plus(periodToAdd), time);
1144c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1145c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(amountToAdd, "amountToAdd");
1146c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (LocalDateTime) amountToAdd.addTo(this);
1147c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1148c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1149c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1150c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the specified amount added.
1151c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1152c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the amount
1153c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * in terms of the unit added. If it is not possible to add the amount, because the
1154c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * unit is not supported or for some other reason, an exception is thrown.
1155c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1156c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is a {@link ChronoUnit} then the addition is implemented here.
1157c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Date units are added as per {@link LocalDate#plus(long, TemporalUnit)}.
1158c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Time units are added as per {@link LocalTime#plus(long, TemporalUnit)} with
1159c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * any overflow in days added equivalent to using {@link #plusDays(long)}.
1160c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1161c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the field is not a {@code ChronoUnit}, then the result of this method
1162c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalUnit.addTo(Temporal, long)}
1163c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the argument. In this case, the unit determines
1164c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * whether and how to perform the addition.
1165c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1166c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1167c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1168c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param amountToAdd  the amount of the unit to add to the result, may be negative
1169c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param unit  the unit of the amount to add, not null
1170c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the specified amount added, not null
1171c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the addition cannot be made
1172c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the unit is not supported
1173c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1174c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1175c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1176c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plus(long amountToAdd, TemporalUnit unit) {
1177c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (unit instanceof ChronoUnit) {
1178c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            ChronoUnit f = (ChronoUnit) unit;
1179c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            switch (f) {
1180c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case NANOS: return plusNanos(amountToAdd);
1181c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case MICROS: return plusDays(amountToAdd / MICROS_PER_DAY).plusNanos((amountToAdd % MICROS_PER_DAY) * 1000);
1182c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case MILLIS: return plusDays(amountToAdd / MILLIS_PER_DAY).plusNanos((amountToAdd % MILLIS_PER_DAY) * 1000_000);
1183c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case SECONDS: return plusSeconds(amountToAdd);
1184c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case MINUTES: return plusMinutes(amountToAdd);
1185c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case HOURS: return plusHours(amountToAdd);
1186c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                case HALF_DAYS: return plusDays(amountToAdd / 256).plusHours((amountToAdd % 256) * 12);  // no overflow (256 is multiple of 2)
1187c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            }
1188c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with(date.plus(amountToAdd, unit), time);
1189c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1190c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return unit.addTo(this, amountToAdd);
1191c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1192c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1193c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1194c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1195c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of years added.
1196c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1197c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method adds the specified amount to the years field in three steps:
1198c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ol>
1199c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Add the input years to the year field</li>
1200c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Check if the resulting date would be invalid</li>
1201c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Adjust the day-of-month to the last valid day if necessary</li>
1202c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ol>
1203c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1204c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2008-02-29 (leap year) plus one year would result in the
1205c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * invalid date 2009-02-29 (standard year). Instead of returning an invalid
1206c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * result, the last valid day of the month, 2009-02-28, is selected instead.
1207c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1208c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1209c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1210c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param years  the years to add, may be negative
1211c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the years added, not null
1212c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1213c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1214c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusYears(long years) {
1215c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate newDate = date.plusYears(years);
1216c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(newDate, time);
1217c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1218c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1219c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1220c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of months added.
1221c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1222c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method adds the specified amount to the months field in three steps:
1223c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ol>
1224c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Add the input months to the month-of-year field</li>
1225c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Check if the resulting date would be invalid</li>
1226c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Adjust the day-of-month to the last valid day if necessary</li>
1227c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ol>
1228c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1229c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2007-03-31 plus one month would result in the invalid date
1230c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * 2007-04-31. Instead of returning an invalid result, the last valid day
1231c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * of the month, 2007-04-30, is selected instead.
1232c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1233c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1234c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1235c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param months  the months to add, may be negative
1236c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the months added, not null
1237c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1238c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1239c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusMonths(long months) {
1240c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate newDate = date.plusMonths(months);
1241c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(newDate, time);
1242c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1243c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1244c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1245c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of weeks added.
1246c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1247c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method adds the specified amount in weeks to the days field incrementing
1248c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * the month and year fields as necessary to ensure the result remains valid.
1249c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result is only invalid if the maximum/minimum year is exceeded.
1250c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1251c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2008-12-31 plus one week would result in 2009-01-07.
1252c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1253c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1254c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1255c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param weeks  the weeks to add, may be negative
1256c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the weeks added, not null
1257c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1258c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1259c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusWeeks(long weeks) {
1260c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate newDate = date.plusWeeks(weeks);
1261c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(newDate, time);
1262c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1263c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1264c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1265c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of days added.
1266c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1267c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method adds the specified amount to the days field incrementing the
1268c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * month and year fields as necessary to ensure the result remains valid.
1269c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result is only invalid if the maximum/minimum year is exceeded.
1270c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1271c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2008-12-31 plus one day would result in 2009-01-01.
1272c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1273c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1274c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1275c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param days  the days to add, may be negative
1276c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the days added, not null
1277c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1278c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1279c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusDays(long days) {
1280c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate newDate = date.plusDays(days);
1281c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(newDate, time);
1282c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1283c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1284c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1285c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1286c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of hours added.
1287c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1288c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1289c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1290c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hours  the hours to add, may be negative
1291c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the hours added, not null
1292c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1293c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1294c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusHours(long hours) {
1295c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, hours, 0, 0, 0, 1);
1296c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1297c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1298c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1299c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of minutes added.
1300c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1301c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1302c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1303c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minutes  the minutes to add, may be negative
1304c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the minutes added, not null
1305c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1306c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1307c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusMinutes(long minutes) {
1308c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, minutes, 0, 0, 1);
1309c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1310c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1311c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1312c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of seconds added.
1313c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1314c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1315c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1316c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param seconds  the seconds to add, may be negative
1317c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the seconds added, not null
1318c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1319c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1320c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusSeconds(long seconds) {
1321c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, 0, seconds, 0, 1);
1322c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1323c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1324c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1325c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of nanoseconds added.
1326c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1327c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1328c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1329c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanos  the nanos to add, may be negative
1330c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the nanoseconds added, not null
1331c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1332c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1333c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime plusNanos(long nanos) {
1334c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, 0, 0, nanos, 1);
1335c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1336c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1337c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1338c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1339c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the specified amount subtracted.
1340c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1341c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the specified amount subtracted.
1342c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The amount is typically {@link Period} or {@link Duration} but may be
1343c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * any other type implementing the {@link TemporalAmount} interface.
1344c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1345c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The calculation is delegated to the amount object by calling
1346c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link TemporalAmount#subtractFrom(Temporal)}. The amount implementation is free
1347c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * to implement the subtraction in any way it wishes, however it typically
1348c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * calls back to {@link #minus(long, TemporalUnit)}. Consult the documentation
1349c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * of the amount implementation to determine if it can be successfully subtracted.
1350c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1351c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1352c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1353c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param amountToSubtract  the amount to subtract, not null
1354c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the subtraction made, not null
1355c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the subtraction cannot be made
1356c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1357c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1358c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1359c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minus(TemporalAmount amountToSubtract) {
1360c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (amountToSubtract instanceof Period) {
1361c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            Period periodToSubtract = (Period) amountToSubtract;
1362c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with(date.minus(periodToSubtract), time);
1363c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1364c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(amountToSubtract, "amountToSubtract");
1365c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (LocalDateTime) amountToSubtract.subtractFrom(this);
1366c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1367c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1368c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1369c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this date-time with the specified amount subtracted.
1370c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1371c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code LocalDateTime}, based on this one, with the amount
1372c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * in terms of the unit subtracted. If it is not possible to subtract the amount,
1373c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * because the unit is not supported or for some other reason, an exception is thrown.
1374c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1375c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method is equivalent to {@link #plus(long, TemporalUnit)} with the amount negated.
1376c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * See that method for a full description of how addition, and thus subtraction, works.
1377c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1378c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1379c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1380c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param amountToSubtract  the amount of the unit to subtract from the result, may be negative
1381c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param unit  the unit of the amount to subtract, not null
1382c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the specified amount subtracted, not null
1383c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the subtraction cannot be made
1384c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the unit is not supported
1385c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1386c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1387c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1388c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minus(long amountToSubtract, TemporalUnit unit) {
1389c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (amountToSubtract == Long.MIN_VALUE ? plus(Long.MAX_VALUE, unit).plus(1, unit) : plus(-amountToSubtract, unit));
1390c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1391c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1392c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1393c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1394c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of years subtracted.
1395c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1396c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method subtracts the specified amount from the years field in three steps:
1397c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ol>
1398c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Subtract the input years from the year field</li>
1399c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Check if the resulting date would be invalid</li>
1400c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Adjust the day-of-month to the last valid day if necessary</li>
1401c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ol>
1402c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1403c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2008-02-29 (leap year) minus one year would result in the
1404c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * invalid date 2009-02-29 (standard year). Instead of returning an invalid
1405c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * result, the last valid day of the month, 2009-02-28, is selected instead.
1406c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1407c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1408c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1409c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param years  the years to subtract, may be negative
1410c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the years subtracted, not null
1411c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1412c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1413c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusYears(long years) {
1414c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (years == Long.MIN_VALUE ? plusYears(Long.MAX_VALUE).plusYears(1) : plusYears(-years));
1415c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1416c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1417c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1418c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of months subtracted.
1419c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1420c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method subtracts the specified amount from the months field in three steps:
1421c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ol>
1422c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Subtract the input months from the month-of-year field</li>
1423c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Check if the resulting date would be invalid</li>
1424c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>Adjust the day-of-month to the last valid day if necessary</li>
1425c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ol>
1426c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1427c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2007-03-31 minus one month would result in the invalid date
1428c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * 2007-04-31. Instead of returning an invalid result, the last valid day
1429c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * of the month, 2007-04-30, is selected instead.
1430c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1431c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1432c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1433c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param months  the months to subtract, may be negative
1434c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the months subtracted, not null
1435c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1436c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1437c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusMonths(long months) {
1438c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (months == Long.MIN_VALUE ? plusMonths(Long.MAX_VALUE).plusMonths(1) : plusMonths(-months));
1439c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1440c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1441c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1442c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of weeks subtracted.
1443c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1444c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method subtracts the specified amount in weeks from the days field decrementing
1445c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * the month and year fields as necessary to ensure the result remains valid.
1446c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result is only invalid if the maximum/minimum year is exceeded.
1447c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1448c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2009-01-07 minus one week would result in 2008-12-31.
1449c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1450c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1451c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1452c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param weeks  the weeks to subtract, may be negative
1453c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the weeks subtracted, not null
1454c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1455c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1456c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusWeeks(long weeks) {
1457c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (weeks == Long.MIN_VALUE ? plusWeeks(Long.MAX_VALUE).plusWeeks(1) : plusWeeks(-weeks));
1458c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1459c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1460c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1461c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of days subtracted.
1462c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1463c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method subtracts the specified amount from the days field decrementing the
1464c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * month and year fields as necessary to ensure the result remains valid.
1465c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result is only invalid if the maximum/minimum year is exceeded.
1466c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1467c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, 2009-01-01 minus one day would result in 2008-12-31.
1468c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1469c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1470c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1471c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param days  the days to subtract, may be negative
1472c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the days subtracted, not null
1473c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1474c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1475c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusDays(long days) {
1476c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return (days == Long.MIN_VALUE ? plusDays(Long.MAX_VALUE).plusDays(1) : plusDays(-days));
1477c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1478c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1479c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1480c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1481c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of hours subtracted.
1482c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1483c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1484c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1485c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hours  the hours to subtract, may be negative
1486c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the hours subtracted, not null
1487c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1488c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1489c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusHours(long hours) {
1490c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, hours, 0, 0, 0, -1);
1491c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer   }
1492c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1493c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1494c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of minutes subtracted.
1495c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1496c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1497c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1498c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minutes  the minutes to subtract, may be negative
1499c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the minutes subtracted, not null
1500c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1501c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1502c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusMinutes(long minutes) {
1503c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, minutes, 0, 0, -1);
1504c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1505c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1506c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1507c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of seconds subtracted.
1508c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1509c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1510c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1511c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param seconds  the seconds to subtract, may be negative
1512c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the seconds subtracted, not null
1513c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1514c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1515c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusSeconds(long seconds) {
1516c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, 0, seconds, 0, -1);
1517c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1518c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1519c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1520c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified number of nanoseconds subtracted.
1521c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1522c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1523c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1524c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanos  the nanos to subtract, may be negative
1525c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a {@code LocalDateTime} based on this date-time with the nanoseconds subtracted, not null
1526c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the result exceeds the supported date range
1527c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1528c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public LocalDateTime minusNanos(long nanos) {
1529c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return plusWithOverflow(date, 0, 0, 0, nanos, -1);
1530c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1531c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1532c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1533c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1534c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Returns a copy of this {@code LocalDateTime} with the specified period added.
1535c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1536c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1537c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1538c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param newDate  the new date to base the calculation on, not null
1539c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param hours  the hours to add, may be negative
1540c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param minutes the minutes to add, may be negative
1541c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param seconds the seconds to add, may be negative
1542c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param nanos the nanos to add, may be negative
1543c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param sign  the sign to determine add or subtract
1544c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the combined result, not null
1545c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1546c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private LocalDateTime plusWithOverflow(LocalDate newDate, long hours, long minutes, long seconds, long nanos, int sign) {
1547c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        // 9223372036854775808 long, 2147483648 int
1548c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if ((hours | minutes | seconds | nanos) == 0) {
1549c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return with(newDate, time);
1550c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1551c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long totDays = nanos / NANOS_PER_DAY +             //   max/24*60*60*1B
1552c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                seconds / SECONDS_PER_DAY +                //   max/24*60*60
1553c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                minutes / MINUTES_PER_DAY +                //   max/24*60
1554c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                hours / HOURS_PER_DAY;                     //   max/24
1555c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        totDays *= sign;                                   // total max*0.4237...
1556c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long totNanos = nanos % NANOS_PER_DAY +                    //   max  86400000000000
1557c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                (seconds % SECONDS_PER_DAY) * NANOS_PER_SECOND +   //   max  86400000000000
1558c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                (minutes % MINUTES_PER_DAY) * NANOS_PER_MINUTE +   //   max  86400000000000
1559c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                (hours % HOURS_PER_DAY) * NANOS_PER_HOUR;          //   max  86400000000000
1560c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long curNoD = time.toNanoOfDay();                       //   max  86400000000000
1561c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        totNanos = totNanos * sign + curNoD;                    // total 432000000000000
1562c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        totDays += Math.floorDiv(totNanos, NANOS_PER_DAY);
1563c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        long newNoD = Math.floorMod(totNanos, NANOS_PER_DAY);
1564c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime newTime = (newNoD == curNoD ? time : LocalTime.ofNanoOfDay(newNoD));
1565c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return with(newDate.plusDays(totDays), newTime);
1566c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1567c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1568c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1569c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1570c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Queries this date-time using the specified query.
1571c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1572c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This queries this date-time using the specified query strategy object.
1573c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@code TemporalQuery} object defines the logic to be used to
1574c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * obtain the result. Read the documentation of the query to understand
1575c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * what the result of this method will be.
1576c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1577c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result of this method is obtained by invoking the
1578c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link TemporalQuery#queryFrom(TemporalAccessor)} method on the
1579c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * specified query passing {@code this} as the argument.
1580c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1581c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param <R> the type of the result
1582c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param query  the query to invoke, not null
1583c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the query result, null may be returned (defined by the query)
1584c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if unable to query (defined by the query)
1585c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
1586c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1587c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @SuppressWarnings("unchecked")
1588c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc
1589c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public <R> R query(TemporalQuery<R> query) {
1590c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (query == TemporalQueries.localDate()) {
1591c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return (R) date;
1592c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1593c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.query(query);
1594c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1595c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1596c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1597c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Adjusts the specified temporal object to have the same date and time as this object.
1598c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1599c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a temporal object of the same observable type as the input
1600c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * with the date and time changed to be the same as this.
1601c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1602c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The adjustment is equivalent to using {@link Temporal#with(TemporalField, long)}
1603c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * twice, passing {@link ChronoField#EPOCH_DAY} and
1604c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link ChronoField#NANO_OF_DAY} as the fields.
1605c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1606c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In most cases, it is clearer to reverse the calling pattern by using
1607c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link Temporal#with(TemporalAdjuster)}:
1608c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1609c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   // these two lines are equivalent, but the second approach is recommended
1610c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   temporal = thisLocalDateTime.adjustInto(temporal);
1611c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   temporal = temporal.with(thisLocalDateTime);
1612c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1613c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1614c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1615c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1616c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param temporal  the target object to be adjusted, not null
1617c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the adjusted object, not null
1618c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if unable to make the adjustment
1619c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1620c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1621c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc
1622c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public Temporal adjustInto(Temporal temporal) {
1623c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.adjustInto(temporal);
1624c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1625c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1626c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1627c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Calculates the amount of time until another date-time in terms of the specified unit.
1628c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1629c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This calculates the amount of time between two {@code LocalDateTime}
1630c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * objects in terms of a single {@code TemporalUnit}.
1631c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The start and end points are {@code this} and the specified date-time.
1632c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The result will be negative if the end is before the start.
1633c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The {@code Temporal} passed to this method is converted to a
1634c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code LocalDateTime} using {@link #from(TemporalAccessor)}.
1635c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, the amount in days between two date-times can be calculated
1636c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * using {@code startDateTime.until(endDateTime, DAYS)}.
1637c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1638c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The calculation returns a whole number, representing the number of
1639c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * complete units between the two date-times.
1640c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For example, the amount in months between 2012-06-15T00:00 and 2012-08-14T23:59
1641c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * will only be one month as it is one minute short of two months.
1642c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1643c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * There are two equivalent ways of using this method.
1644c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The first is to invoke this method.
1645c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}:
1646c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1647c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   // these two lines are equivalent
1648c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   amount = start.until(end, MONTHS);
1649c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   amount = MONTHS.between(start, end);
1650c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1651c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The choice should be made based on which makes the code more readable.
1652c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1653c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The calculation is implemented in this method for {@link ChronoUnit}.
1654c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The units {@code NANOS}, {@code MICROS}, {@code MILLIS}, {@code SECONDS},
1655c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code MINUTES}, {@code HOURS} and {@code HALF_DAYS}, {@code DAYS},
1656c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code WEEKS}, {@code MONTHS}, {@code YEARS}, {@code DECADES},
1657c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@code CENTURIES}, {@code MILLENNIA} and {@code ERAS} are supported.
1658c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Other {@code ChronoUnit} values will throw an exception.
1659c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1660c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If the unit is not a {@code ChronoUnit}, then the result of this method
1661c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is obtained by invoking {@code TemporalUnit.between(Temporal, Temporal)}
1662c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * passing {@code this} as the first argument and the converted input temporal
1663c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * as the second argument.
1664c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1665c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This instance is immutable and unaffected by this method call.
1666c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1667c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param endExclusive  the end date, exclusive, which is converted to a {@code LocalDateTime}, not null
1668c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param unit  the unit to measure the amount in, not null
1669c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the amount of time between this date-time and the end date-time
1670c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if the amount cannot be calculated, or the end
1671c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  temporal cannot be converted to a {@code LocalDateTime}
1672c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws UnsupportedTemporalTypeException if the unit is not supported
1673c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws ArithmeticException if numeric overflow occurs
1674c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1675c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1676c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public long until(Temporal endExclusive, TemporalUnit unit) {
1677c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDateTime end = LocalDateTime.from(endExclusive);
1678c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (unit instanceof ChronoUnit) {
1679c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            if (unit.isTimeBased()) {
1680c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                long amount = date.daysUntil(end.date);
1681c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                if (amount == 0) {
1682c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    return time.until(end.time, unit);
1683c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                }
1684c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                long timePart = end.time.toNanoOfDay() - time.toNanoOfDay();
1685c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                if (amount > 0) {
1686c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    amount--;  // safe
1687c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    timePart += NANOS_PER_DAY;  // safe
1688c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                } else {
1689c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    amount++;  // safe
1690c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    timePart -= NANOS_PER_DAY;  // safe
1691c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                }
1692c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                switch ((ChronoUnit) unit) {
1693c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case NANOS:
1694c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, NANOS_PER_DAY);
1695c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1696c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case MICROS:
1697c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, MICROS_PER_DAY);
1698c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / 1000;
1699c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1700c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case MILLIS:
1701c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, MILLIS_PER_DAY);
1702c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / 1_000_000;
1703c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1704c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case SECONDS:
1705c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, SECONDS_PER_DAY);
1706c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / NANOS_PER_SECOND;
1707c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1708c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case MINUTES:
1709c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, MINUTES_PER_DAY);
1710c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / NANOS_PER_MINUTE;
1711c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1712c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case HOURS:
1713c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, HOURS_PER_DAY);
1714c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / NANOS_PER_HOUR;
1715c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1716c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                    case HALF_DAYS:
1717c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        amount = Math.multiplyExact(amount, 2);
1718c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        timePart = timePart / (NANOS_PER_HOUR * 12);
1719c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                        break;
1720c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                }
1721c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                return Math.addExact(amount, timePart);
1722c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            }
1723c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            LocalDate endDate = end.date;
1724c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            if (endDate.isAfter(date) && end.time.isBefore(time)) {
1725c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                endDate = endDate.minusDays(1);
1726c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            } else if (endDate.isBefore(date) && end.time.isAfter(time)) {
1727c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer                endDate = endDate.plusDays(1);
1728c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            }
1729c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return date.until(endDate, unit);
1730c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1731c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return unit.between(this, end);
1732c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1733c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1734c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1735c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Formats this date-time using the specified formatter.
1736c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1737c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This date-time will be passed to the formatter to produce a string.
1738c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1739c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param formatter  the formatter to use, not null
1740c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the formatted date-time string, not null
1741c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws DateTimeException if an error occurs during printing
1742c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1743c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc and performance
1744c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public String format(DateTimeFormatter formatter) {
1745c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        Objects.requireNonNull(formatter, "formatter");
1746c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return formatter.format(this);
1747c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1748c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1749c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1750c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1751c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Combines this date-time with an offset to create an {@code OffsetDateTime}.
1752c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1753c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns an {@code OffsetDateTime} formed from this date-time at the specified offset.
1754c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * All possible combinations of date-time and offset are valid.
1755c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1756c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param offset  the offset to combine with, not null
1757c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the offset date-time formed from this date-time and the specified offset, not null
1758c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1759c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public OffsetDateTime atOffset(ZoneOffset offset) {
1760c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return OffsetDateTime.of(this, offset);
1761c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1762c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1763c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1764c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Combines this date-time with a time-zone to create a {@code ZonedDateTime}.
1765c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1766c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This returns a {@code ZonedDateTime} formed from this date-time at the
1767c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * specified time-zone. The result will match this date-time as closely as possible.
1768c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Time-zone rules, such as daylight savings, mean that not every local date-time
1769c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * is valid for the specified zone, thus the local date-time may be adjusted.
1770c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1771c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The local date-time is resolved to a single instant on the time-line.
1772c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is achieved by finding a valid offset from UTC/Greenwich for the local
1773c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * date-time as defined by the {@link ZoneRules rules} of the zone ID.
1774c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *<p>
1775c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In most cases, there is only one valid offset for a local date-time.
1776c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In the case of an overlap, where clocks are set back, there are two valid offsets.
1777c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method uses the earlier offset typically corresponding to "summer".
1778c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1779c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * In the case of a gap, where clocks jump forward, there is no valid offset.
1780c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Instead, the local date-time is adjusted to be later by the length of the gap.
1781c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * For a typical one hour daylight savings change, the local date-time will be
1782c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * moved one hour later into the offset typically corresponding to "summer".
1783c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1784c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * To obtain the later offset during an overlap, call
1785c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link ZonedDateTime#withLaterOffsetAtOverlap()} on the result of this method.
1786c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * To throw an exception when there is a gap or overlap, use
1787c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * {@link ZonedDateTime#ofStrict(LocalDateTime, ZoneOffset, ZoneId)}.
1788c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1789c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param zone  the time-zone to use, not null
1790c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the zoned date-time formed from this date-time, not null
1791c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1792c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1793c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public ZonedDateTime atZone(ZoneId zone) {
1794c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ZonedDateTime.of(this, zone);
1795c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1796c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1797c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1798c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1799c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Compares this date-time to another date-time.
1800c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1801c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The comparison is primarily based on the date-time, from earliest to latest.
1802c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * It is "consistent with equals", as defined by {@link Comparable}.
1803c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1804c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If all the date-times being compared are instances of {@code LocalDateTime},
1805c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * then the comparison will be entirely based on the date-time.
1806c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * If some dates being compared are in different chronologies, then the
1807c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * chronology is also considered, see {@link ChronoLocalDateTime#compareTo}.
1808c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1809c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param other  the other date-time to compare to, not null
1810c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the comparator value, negative if less, positive if greater
1811c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1812c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc and performance
1813c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int compareTo(ChronoLocalDateTime<?> other) {
1814c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (other instanceof LocalDateTime) {
1815c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return compareTo0((LocalDateTime) other);
1816c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1817c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.compareTo(other);
1818c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1819c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1820c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private int compareTo0(LocalDateTime other) {
1821c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int cmp = date.compareTo0(other.toLocalDate());
1822c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (cmp == 0) {
1823c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            cmp = time.compareTo(other.toLocalTime());
1824c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1825c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return cmp;
1826c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1827c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1828c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1829c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if this date-time is after the specified date-time.
1830c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1831c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This checks to see if this date-time represents a point on the
1832c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * local time-line after the other date-time.
1833c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1834c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
1835c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
1836c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isAfter(b) == false
1837c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isAfter(a) == false
1838c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   b.isAfter(a) == true
1839c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1840c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1841c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method only considers the position of the two date-times on the local time-line.
1842c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * It does not take into account the chronology, or calendar system.
1843c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is different from the comparison in {@link #compareTo(ChronoLocalDateTime)},
1844c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * but is the same approach as {@link ChronoLocalDateTime#timeLineOrder()}.
1845c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1846c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param other  the other date-time to compare to, not null
1847c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if this date-time is after the specified date-time
1848c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1849c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc and performance
1850c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean isAfter(ChronoLocalDateTime<?> other) {
1851c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (other instanceof LocalDateTime) {
1852c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return compareTo0((LocalDateTime) other) > 0;
1853c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1854c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.isAfter(other);
1855c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1856c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1857c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1858c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if this date-time is before the specified date-time.
1859c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1860c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This checks to see if this date-time represents a point on the
1861c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * local time-line before the other date-time.
1862c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1863c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
1864c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
1865c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isBefore(b) == true
1866c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isBefore(a) == false
1867c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   b.isBefore(a) == false
1868c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1869c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1870c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method only considers the position of the two date-times on the local time-line.
1871c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * It does not take into account the chronology, or calendar system.
1872c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is different from the comparison in {@link #compareTo(ChronoLocalDateTime)},
1873c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * but is the same approach as {@link ChronoLocalDateTime#timeLineOrder()}.
1874c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1875c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param other  the other date-time to compare to, not null
1876c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if this date-time is before the specified date-time
1877c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1878c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc and performance
1879c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean isBefore(ChronoLocalDateTime<?> other) {
1880c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (other instanceof LocalDateTime) {
1881c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return compareTo0((LocalDateTime) other) < 0;
1882c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1883c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.isBefore(other);
1884c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1885c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1886c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1887c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if this date-time is equal to the specified date-time.
1888c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1889c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This checks to see if this date-time represents the same point on the
1890c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * local time-line as the other date-time.
1891c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1892c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
1893c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
1894c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isEqual(b) == false
1895c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   a.isEqual(a) == true
1896c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *   b.isEqual(a) == false
1897c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1898c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1899c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This method only considers the position of the two date-times on the local time-line.
1900c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * It does not take into account the chronology, or calendar system.
1901c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * This is different from the comparison in {@link #compareTo(ChronoLocalDateTime)},
1902c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * but is the same approach as {@link ChronoLocalDateTime#timeLineOrder()}.
1903c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1904c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param other  the other date-time to compare to, not null
1905c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if this date-time is equal to the specified date-time
1906c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1907c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override  // override for Javadoc and performance
1908c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean isEqual(ChronoLocalDateTime<?> other) {
1909c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (other instanceof LocalDateTime) {
1910c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return compareTo0((LocalDateTime) other) == 0;
1911c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1912c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return ChronoLocalDateTime.super.isEqual(other);
1913c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1914c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1915c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1916c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1917c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Checks if this date-time is equal to another date-time.
1918c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1919c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Compares this {@code LocalDateTime} with another ensuring that the date-time is the same.
1920c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Only objects of type {@code LocalDateTime} are compared, other types return false.
1921c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1922c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param obj  the object to check, null returns false
1923c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return true if this is equal to the other date-time
1924c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1925c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1926c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public boolean equals(Object obj) {
1927c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (this == obj) {
1928c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return true;
1929c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1930c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (obj instanceof LocalDateTime) {
1931c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            LocalDateTime other = (LocalDateTime) obj;
1932c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            return date.equals(other.date) && time.equals(other.time);
1933c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
1934c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return false;
1935c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1936c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1937c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1938c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * A hash code for this date-time.
1939c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1940c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a suitable hash code
1941c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1942c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1943c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public int hashCode() {
1944c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.hashCode() ^ time.hashCode();
1945c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1946c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1947c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1948c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1949c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Outputs this date-time as a {@code String}, such as {@code 2007-12-03T10:15:30}.
1950c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <p>
1951c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The output will be one of the following ISO-8601 formats:
1952c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <ul>
1953c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code uuuu-MM-dd'T'HH:mm}</li>
1954c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code uuuu-MM-dd'T'HH:mm:ss}</li>
1955c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code uuuu-MM-dd'T'HH:mm:ss.SSS}</li>
1956c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code uuuu-MM-dd'T'HH:mm:ss.SSSSSS}</li>
1957c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <li>{@code uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS}</li>
1958c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </ul>
1959c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * The format used will be the shortest that outputs the full value of
1960c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * the time where the omitted parts are implied to be zero.
1961c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1962c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return a string representation of this date-time, not null
1963c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1964c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Override
1965c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public String toString() {
1966c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return date.toString() + 'T' + time.toString();
1967c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1968c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1969c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
1970c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1971c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Writes the object using a
1972c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <a href="../../serialized-form.html#java.time.Ser">dedicated serialized form</a>.
1973c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @serialData
1974c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * <pre>
1975c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  out.writeByte(5);  // identifies a LocalDateTime
1976c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  // the <a href="../../serialized-form.html#java.time.LocalDate">date</a> excluding the one byte header
1977c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *  // the <a href="../../serialized-form.html#java.time.LocalTime">time</a> excluding the one byte header
1978c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * </pre>
1979c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1980c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @return the instance of {@code Ser}, not null
1981c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1982c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private Object writeReplace() {
1983c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Ser(Ser.LOCAL_DATE_TIME_TYPE, this);
1984c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1985c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1986c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    /**
1987c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * Defend against malicious streams.
1988c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     *
1989c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @param s the stream to read
1990c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     * @throws InvalidObjectException always
1991c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer     */
1992c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private void readObject(ObjectInputStream s) throws InvalidObjectException {
1993c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        throw new InvalidObjectException("Deserialization via serialization delegate");
1994c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
1995c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
1996c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    void writeExternal(DataOutput out) throws IOException {
1997c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        date.writeExternal(out);
1998c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        time.writeExternal(out);
1999c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
2000c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
2001c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    static LocalDateTime readExternal(DataInput in) throws IOException {
2002c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalDate date = LocalDate.readExternal(in);
2003c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        LocalTime time = LocalTime.readExternal(in);
2004c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return LocalDateTime.of(date, time);
2005c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
2006c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
2007c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer}
2008