EMMA Coverage Report (generated Tue Oct 28 00:01:11 GMT 2008)
[all classes][org.joda.time]

COVERAGE SUMMARY FOR SOURCE FILE [DateMidnight.java]

nameclass, %method, %block, %line, %
DateMidnight.java100% (2/2)100% (82/82)100% (845/845)100% (159/159)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class DateMidnight100% (1/1)100% (62/62)100% (674/674)100% (131/131)
DateMidnight (): void 100% (1/1)100% (3/3)100% (2/2)
DateMidnight (Chronology): void 100% (1/1)100% (4/4)100% (2/2)
DateMidnight (DateTimeZone): void 100% (1/1)100% (4/4)100% (2/2)
DateMidnight (Object): void 100% (1/1)100% (6/6)100% (2/2)
DateMidnight (Object, Chronology): void 100% (1/1)100% (6/6)100% (2/2)
DateMidnight (Object, DateTimeZone): void 100% (1/1)100% (5/5)100% (2/2)
DateMidnight (int, int, int): void 100% (1/1)100% (10/10)100% (2/2)
DateMidnight (int, int, int, Chronology): void 100% (1/1)100% (11/11)100% (2/2)
DateMidnight (int, int, int, DateTimeZone): void 100% (1/1)100% (11/11)100% (2/2)
DateMidnight (long): void 100% (1/1)100% (4/4)100% (2/2)
DateMidnight (long, Chronology): void 100% (1/1)100% (5/5)100% (2/2)
DateMidnight (long, DateTimeZone): void 100% (1/1)100% (5/5)100% (2/2)
centuryOfEra (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
checkInstant (long, Chronology): long 100% (1/1)100% (5/5)100% (1/1)
dayOfMonth (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
dayOfWeek (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
dayOfYear (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
era (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
minus (ReadableDuration): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
minus (ReadablePeriod): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
minus (long): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
minusDays (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
minusMonths (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
minusWeeks (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
minusYears (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
monthOfYear (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
plus (ReadableDuration): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
plus (ReadablePeriod): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
plus (long): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
plusDays (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
plusMonths (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
plusWeeks (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
plusYears (int): DateMidnight 100% (1/1)100% (16/16)100% (4/4)
property (DateTimeFieldType): DateMidnight$Property 100% (1/1)100% (35/35)100% (6/6)
toInterval (): Interval 100% (1/1)100% (20/20)100% (4/4)
toLocalDate (): LocalDate 100% (1/1)100% (8/8)100% (1/1)
toYearMonthDay (): YearMonthDay 100% (1/1)100% (8/8)100% (1/1)
weekOfWeekyear (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
weekyear (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
withCenturyOfEra (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withChronology (Chronology): DateMidnight 100% (1/1)100% (13/13)100% (1/1)
withDayOfMonth (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withDayOfWeek (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withDayOfYear (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withDurationAdded (ReadableDuration, int): DateMidnight 100% (1/1)100% (12/12)100% (3/3)
withDurationAdded (long, int): DateMidnight 100% (1/1)100% (20/20)100% (4/4)
withEra (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withField (DateTimeFieldType, int): DateMidnight 100% (1/1)100% (20/20)100% (4/4)
withFieldAdded (DurationFieldType, int): DateMidnight 100% (1/1)100% (24/24)100% (6/6)
withFields (ReadablePartial): DateMidnight 100% (1/1)100% (13/13)100% (3/3)
withMillis (long): DateMidnight 100% (1/1)100% (21/21)100% (3/3)
withMonthOfYear (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withPeriodAdded (ReadablePeriod, int): DateMidnight 100% (1/1)100% (18/18)100% (4/4)
withWeekOfWeekyear (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withWeekyear (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withYear (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withYearOfCentury (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withYearOfEra (int): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
withZoneRetainFields (DateTimeZone): DateMidnight 100% (1/1)100% (27/27)100% (6/6)
year (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
yearOfCentury (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
yearOfEra (): DateMidnight$Property 100% (1/1)100% (8/8)100% (1/1)
     
class DateMidnight$Property100% (1/1)100% (20/20)100% (171/171)100% (28/28)
DateMidnight$Property (DateMidnight, DateTimeField): void 100% (1/1)100% (9/9)100% (4/4)
addToCopy (int): DateMidnight 100% (1/1)100% (11/11)100% (1/1)
addToCopy (long): DateMidnight 100% (1/1)100% (11/11)100% (1/1)
addWrapFieldToCopy (int): DateMidnight 100% (1/1)100% (11/11)100% (1/1)
getChronology (): Chronology 100% (1/1)100% (4/4)100% (1/1)
getDateMidnight (): DateMidnight 100% (1/1)100% (3/3)100% (1/1)
getField (): DateTimeField 100% (1/1)100% (3/3)100% (1/1)
getMillis (): long 100% (1/1)100% (4/4)100% (1/1)
readObject (ObjectInputStream): void 100% (1/1)100% (17/17)100% (4/4)
roundCeilingCopy (): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
roundFloorCopy (): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
roundHalfCeilingCopy (): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
roundHalfEvenCopy (): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
roundHalfFloorCopy (): DateMidnight 100% (1/1)100% (10/10)100% (1/1)
setCopy (String): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
setCopy (String, Locale): DateMidnight 100% (1/1)100% (12/12)100% (1/1)
setCopy (int): DateMidnight 100% (1/1)100% (11/11)100% (1/1)
withMaximumValue (): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
withMinimumValue (): DateMidnight 100% (1/1)100% (5/5)100% (1/1)
writeObject (ObjectOutputStream): void 100% (1/1)100% (10/10)100% (3/3)

1/*
2 *  Copyright 2001-2006 Stephen Colebourne
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License");
5 *  you may not use this file except in compliance with the License.
6 *  You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 */
16package org.joda.time;
17 
18import java.io.IOException;
19import java.io.ObjectInputStream;
20import java.io.ObjectOutputStream;
21import java.io.Serializable;
22import java.util.Locale;
23 
24import org.joda.time.base.BaseDateTime;
25import org.joda.time.field.AbstractReadableInstantFieldProperty;
26import org.joda.time.format.ISODateTimeFormat;
27 
28/**
29 * DateMidnight defines a date where the time component is fixed at midnight.
30 * The class uses a time zone, thus midnight is local unless a UTC time zone is used.
31 * <p>
32 * It is important to emphasise that this class represents the time of midnight on
33 * any given day.
34 * Note that midnight is defined as 00:00, which is at the very start of a day.
35 * <p>
36 * This class does not represent a day, but the millisecond instant at midnight.
37 * If you need a class that represents the whole day, then an {@link Interval} or
38 * a {@link LocalDate} may be more suitable.
39 * <p>
40 * This class uses a Chronology internally. The Chronology determines how the
41 * millisecond instant value is converted into the date time fields.
42 * The default Chronology is <code>ISOChronology</code> which is the agreed
43 * international standard and compatable with the modern Gregorian calendar.
44 *
45 * <p>Each individual field can be queried in two ways:
46 * <ul>
47 * <li><code>getDayOfMonth()</code>
48 * <li><code>dayOfMonth().get()</code>
49 * </ul>
50 * The second technique also provides access to other useful methods on the
51 * field:
52 * <ul>
53 * <li>numeric value
54 * <li>text value
55 * <li>short text value
56 * <li>maximum/minimum values
57 * <li>add/subtract
58 * <li>set
59 * <li>rounding
60 * </ul>
61 *
62 * <p>
63 * DateMidnight is thread-safe and immutable, provided that the Chronology is as well.
64 * All standard Chronology classes supplied are thread-safe and immutable.
65 *
66 * @author Stephen Colebourne
67 * @since 1.0
68 */
69public final class DateMidnight
70        extends BaseDateTime
71        implements ReadableDateTime, Serializable {
72    
73    /** Serialization lock */
74    private static final long serialVersionUID = 156371964018738L;
75 
76    // Constructors
77    //-----------------------------------------------------------------------
78    /**
79     * Constructs an instance set to the current system millisecond time
80     * using <code>ISOChronology</code> in the default time zone.
81     * The constructed object will have a local time of midnight.
82     */
83    public DateMidnight() {
84        super();
85    }
86 
87    /**
88     * Constructs an instance set to the current system millisecond time
89     * using <code>ISOChronology</code> in the specified time zone.
90     * The constructed object will have a local time of midnight.
91     * <p>
92     * If the specified time zone is null, the default zone is used.
93     *
94     * @param zone  the time zone, null means default zone
95     */
96    public DateMidnight(DateTimeZone zone) {
97        super(zone);
98    }
99 
100    /**
101     * Constructs an instance set to the current system millisecond time
102     * using the specified chronology.
103     * The constructed object will have a local time of midnight.
104     * <p>
105     * If the chronology is null, <code>ISOChronology</code>
106     * in the default time zone is used.
107     *
108     * @param chronology  the chronology, null means ISOChronology in default zone
109     */
110    public DateMidnight(Chronology chronology) {
111        super(chronology);
112    }
113 
114    //-----------------------------------------------------------------------
115    /**
116     * Constructs an instance set to the milliseconds from 1970-01-01T00:00:00Z
117     * using <code>ISOChronology</code> in the default time zone.
118     * The constructed object will have a local time of midnight.
119     *
120     * @param instant  the milliseconds from 1970-01-01T00:00:00Z
121     */
122    public DateMidnight(long instant) {
123        super(instant);
124    }
125 
126    /**
127     * Constructs an instance set to the milliseconds from 1970-01-01T00:00:00Z
128     * using <code>ISOChronology</code> in the specified time zone.
129     * The constructed object will have a local time of midnight.
130     * <p>
131     * If the specified time zone is null, the default zone is used.
132     *
133     * @param instant  the milliseconds from 1970-01-01T00:00:00Z
134     * @param zone  the time zone, null means default zone
135     */
136    public DateMidnight(long instant, DateTimeZone zone) {
137        super(instant, zone);
138    }
139 
140    /**
141     * Constructs an instance set to the milliseconds from 1970-01-01T00:00:00Z
142     * using the specified chronology.
143     * The constructed object will have a local time of midnight.
144     * <p>
145     * If the chronology is null, <code>ISOChronology</code>
146     * in the default time zone is used.
147     *
148     * @param instant  the milliseconds from 1970-01-01T00:00:00Z
149     * @param chronology  the chronology, null means ISOChronology in default zone
150     */
151    public DateMidnight(long instant, Chronology chronology) {
152        super(instant, chronology);
153    }
154 
155    //-----------------------------------------------------------------------
156    /**
157     * Constructs an instance from an Object that represents a datetime.
158     * The constructed object will have a local time of midnight.
159     * <p>
160     * If the object implies a chronology (such as GregorianCalendar does),
161     * then that chronology will be used. Otherwise, ISO default is used.
162     * Thus if a GregorianCalendar is passed in, the chronology used will
163     * be GJ, but if a Date is passed in the chronology will be ISO.
164     * <p>
165     * The recognised object types are defined in
166     * {@link org.joda.time.convert.ConverterManager ConverterManager} and
167     * include ReadableInstant, String, Calendar and Date.
168     * The String formats are described by {@link ISODateTimeFormat#dateTimeParser()}.
169     *
170     * @param instant  the datetime object, null means now
171     * @throws IllegalArgumentException if the instant is invalid
172     */
173    public DateMidnight(Object instant) {
174        super(instant, (Chronology) null);
175    }
176 
177    /**
178     * Constructs an instance from an Object that represents a datetime,
179     * forcing the time zone to that specified.
180     * The constructed object will have a local time of midnight.
181     * <p>
182     * If the object implies a chronology (such as GregorianCalendar does),
183     * then that chronology will be used, but with the time zone adjusted.
184     * Otherwise, ISO is used in the specified time zone.
185     * If the specified time zone is null, the default zone is used.
186     * Thus if a GregorianCalendar is passed in, the chronology used will
187     * be GJ, but if a Date is passed in the chronology will be ISO.
188     * <p>
189     * The recognised object types are defined in
190     * {@link org.joda.time.convert.ConverterManager ConverterManager} and
191     * include ReadableInstant, String, Calendar and Date.
192     * The String formats are described by {@link ISODateTimeFormat#dateTimeParser()}.
193     *
194     * @param instant  the datetime object, null means now
195     * @param zone  the time zone, null means default time zone
196     * @throws IllegalArgumentException if the instant is invalid
197     */
198    public DateMidnight(Object instant, DateTimeZone zone) {
199        super(instant, zone);
200    }
201 
202    /**
203     * Constructs an instance from an Object that represents a datetime,
204     * using the specified chronology.
205     * The constructed object will have a local time of midnight.
206     * <p>
207     * If the chronology is null, ISO in the default time zone is used.
208     * Any chronology implied by the object (such as GregorianCalendar does)
209     * is ignored.
210     * <p>
211     * The recognised object types are defined in
212     * {@link org.joda.time.convert.ConverterManager ConverterManager} and
213     * include ReadableInstant, String, Calendar and Date.
214     * The String formats are described by {@link ISODateTimeFormat#dateTimeParser()}.
215     *
216     * @param instant  the datetime object, null means now
217     * @param chronology  the chronology, null means ISOChronology in default zone
218     * @throws IllegalArgumentException if the instant is invalid
219     */
220    public DateMidnight(Object instant, Chronology chronology) {
221        super(instant, DateTimeUtils.getChronology(chronology));
222    }
223 
224    //-----------------------------------------------------------------------
225    /**
226     * Constructs an instance from datetime field values
227     * using <code>ISOChronology</code> in the default time zone.
228     * The constructed object will have a local time of midnight.
229     *
230     * @param year  the year
231     * @param monthOfYear  the month of the year
232     * @param dayOfMonth  the day of the month
233     */
234    public DateMidnight(int year, int monthOfYear, int dayOfMonth) {
235        super(year, monthOfYear, dayOfMonth, 0, 0, 0, 0);
236    }
237 
238    /**
239     * Constructs an instance from datetime field values
240     * using <code>ISOChronology</code> in the specified time zone.
241     * The constructed object will have a local time of midnight.
242     * <p>
243     * If the specified time zone is null, the default zone is used.
244     *
245     * @param year  the year
246     * @param monthOfYear  the month of the year
247     * @param dayOfMonth  the day of the month
248     * @param zone  the time zone, null means default time zone
249     */
250    public DateMidnight(int year, int monthOfYear, int dayOfMonth, DateTimeZone zone) {
251        super(year, monthOfYear, dayOfMonth, 0, 0, 0, 0, zone);
252    }
253 
254    /**
255     * Constructs an instance from datetime field values
256     * using the specified chronology.
257     * The constructed object will have a local time of midnight.
258     * <p>
259     * If the chronology is null, <code>ISOChronology</code>
260     * in the default time zone is used.
261     *
262     * @param year  the year
263     * @param monthOfYear  the month of the year
264     * @param dayOfMonth  the day of the month
265     * @param chronology  the chronology, null means ISOChronology in default zone
266     */
267    public DateMidnight(int year, int monthOfYear, int dayOfMonth, Chronology chronology) {
268        super(year, monthOfYear, dayOfMonth, 0, 0, 0, 0, chronology);
269    }
270 
271    /**
272     * Rounds the specified instant to midnight.
273     *
274     * @param instant  the milliseconds from 1970-01-01T00:00:00Z to round
275     * @param chronology  the chronology to use, not null
276     * @return the updated instant, rounded to midnight
277     */
278    protected long checkInstant(long instant, Chronology chronology) {
279        return chronology.dayOfMonth().roundFloor(instant);
280    }
281 
282    //-----------------------------------------------------------------------
283    /**
284     * Returns a copy of this date with a different millisecond instant.
285     * The returned object will have a local time of midnight.
286     * <p>
287     * Only the millis will change, the chronology and time zone are kept.
288     * The returned object will be either be a new instance or <code>this</code>.
289     *
290     * @param newMillis  the new millis, from 1970-01-01T00:00:00Z
291     * @return a copy of this instant with different millis
292     */
293    public DateMidnight withMillis(long newMillis) {
294        Chronology chrono = getChronology();
295        newMillis = checkInstant(newMillis, chrono);
296        return (newMillis == getMillis() ? this : new DateMidnight(newMillis, chrono));
297    }
298 
299    /**
300     * Returns a copy of this date with a different chronology, potentially
301     * changing the day in unexpected ways.
302     * <p>
303     * This method creates a new DateMidnight using the midnight millisecond value
304     * and the new chronology. If the same or similar chronology is specified, but
305     * with a different time zone, the day may change. This occurs because the new
306     * DateMidnight rounds down the millisecond value to get to midnight, and the
307     * time zone change may result in a rounding down to a different day.
308     * <p>
309     * For example, changing time zone from London (+00:00) to Paris (+01:00) will
310     * retain the same day, but changing from Paris to London will change the day.
311     * (When its midnight in London its the same day in Paris, but when its midnight
312     * in Paris its still the previous day in London)
313     * <p>
314     * To avoid these unusual effects, use {@link #withZoneRetainFields(DateTimeZone)}
315     * to change time zones.
316     *
317     * @param newChronology  the new chronology
318     * @return a copy of this instant with a different chronology
319     */
320    public DateMidnight withChronology(Chronology newChronology) {
321        return (newChronology == getChronology() ? this : new DateMidnight(getMillis(), newChronology));
322    }
323 
324    /**
325     * Returns a copy of this date with a different time zone, preserving the day
326     * The returned object will have a local time of midnight in the new zone on
327     * the same day as the original instant.
328     *
329     * @param newZone  the new time zone, null means default
330     * @return a copy of this instant with a different time zone
331     */
332    public DateMidnight withZoneRetainFields(DateTimeZone newZone) {
333        newZone = DateTimeUtils.getZone(newZone);
334        DateTimeZone originalZone = DateTimeUtils.getZone(getZone());
335        if (newZone == originalZone) {
336            return this;
337        }
338        
339        long millis = originalZone.getMillisKeepLocal(newZone, getMillis());
340        return new DateMidnight(millis, getChronology().withZone(newZone));
341    }
342 
343    //-----------------------------------------------------------------------
344    /**
345     * Returns a copy of this date with the partial set of fields replacing those
346     * from this instance.
347     * <p>
348     * For example, if the partial is a <code>LocalDate</code> then the date fields
349     * would be changed in the returned instance.
350     * If the partial is null, then <code>this</code> is returned.
351     *
352     * @param partial  the partial set of fields to apply to this datetime, null ignored
353     * @return a copy of this datetime with a different set of fields
354     * @throws IllegalArgumentException if any value is invalid
355     */
356    public DateMidnight withFields(ReadablePartial partial) {
357        if (partial == null) {
358            return this;
359        }
360        return withMillis(getChronology().set(partial, getMillis()));
361    }
362 
363    /**
364     * Returns a copy of this date with the specified field set to a new value.
365     * <p>
366     * For example, if the field type is <code>dayOfMonth</code> then the day of month
367     * field would be changed in the returned instance.
368     * If the field type is null, then <code>this</code> is returned.
369     * <p>
370     * These three lines are equivalent:
371     * <pre>
372     * DateTime updated = dt.withField(DateTimeFieldType.dayOfMonth(), 6);
373     * DateTime updated = dt.dayOfMonth().setCopy(6);
374     * DateTime updated = dt.property(DateTimeFieldType.dayOfMonth()).setCopy(6);
375     * </pre>
376     *
377     * @param fieldType  the field type to set, not null
378     * @param value  the value to set
379     * @return a copy of this datetime with the field set
380     * @throws IllegalArgumentException if the value is null or invalid
381     */
382    public DateMidnight withField(DateTimeFieldType fieldType, int value) {
383        if (fieldType == null) {
384            throw new IllegalArgumentException("Field must not be null");
385        }
386        long instant = fieldType.getField(getChronology()).set(getMillis(), value);
387        return withMillis(instant);
388    }
389 
390    /**
391     * Returns a copy of this date with the value of the specified field increased.
392     * <p>
393     * If the addition is zero or the field is null, then <code>this</code> is returned.
394     * <p>
395     * These three lines are equivalent:
396     * <pre>
397     * DateMidnight added = dt.withFieldAdded(DateTimeFieldType.year(), 6);
398     * DateMidnight added = dt.plusYears(6);
399     * DateMidnight added = dt.year().addToCopy(6);
400     * </pre>
401     * 
402     * @param fieldType  the field type to add to, not null
403     * @param amount  the amount to add
404     * @return a copy of this datetime with the field updated
405     * @throws IllegalArgumentException if the value is null or invalid
406     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
407     */
408    public DateMidnight withFieldAdded(DurationFieldType fieldType, int amount) {
409        if (fieldType == null) {
410            throw new IllegalArgumentException("Field must not be null");
411        }
412        if (amount == 0) {
413            return this;
414        }
415        long instant = fieldType.getField(getChronology()).add(getMillis(), amount);
416        return withMillis(instant);
417    }
418 
419    //-----------------------------------------------------------------------
420    /**
421     * Returns a copy of this date with the specified duration added.
422     * <p>
423     * If the addition is zero, then <code>this</code> is returned.
424     * 
425     * @param durationToAdd  the duration to add to this one
426     * @param scalar  the amount of times to add, such as -1 to subtract once
427     * @return a copy of this datetime with the duration added
428     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
429     */
430    public DateMidnight withDurationAdded(long durationToAdd, int scalar) {
431        if (durationToAdd == 0 || scalar == 0) {
432            return this;
433        }
434        long instant = getChronology().add(getMillis(), durationToAdd, scalar);
435        return withMillis(instant);
436    }
437 
438    /**
439     * Returns a copy of this date with the specified duration added.
440     * <p>
441     * If the addition is zero, then <code>this</code> is returned.
442     * 
443     * @param durationToAdd  the duration to add to this one, null means zero
444     * @param scalar  the amount of times to add, such as -1 to subtract once
445     * @return a copy of this datetime with the duration added
446     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
447     */
448    public DateMidnight withDurationAdded(ReadableDuration durationToAdd, int scalar) {
449        if (durationToAdd == null || scalar == 0) {
450            return this;
451        }
452        return withDurationAdded(durationToAdd.getMillis(), scalar);
453    }
454 
455    /**
456     * Returns a copy of this date with the specified period added.
457     * <p>
458     * If the addition is zero, then <code>this</code> is returned.
459     * <p>
460     * This method is typically used to add multiple copies of complex
461     * period instances. Adding one field is best achieved using methods
462     * like {@link #withFieldAdded(DurationFieldType, int)}
463     * or {@link #plusYears(int)}.
464     * 
465     * @param period  the period to add to this one, null means zero
466     * @param scalar  the amount of times to add, such as -1 to subtract once
467     * @return a copy of this datetime with the period added
468     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
469     */
470    public DateMidnight withPeriodAdded(ReadablePeriod period, int scalar) {
471        if (period == null || scalar == 0) {
472            return this;
473        }
474        long instant = getChronology().add(period, getMillis(), scalar);
475        return withMillis(instant);
476    }
477 
478    //-----------------------------------------------------------------------
479    /**
480     * Returns a copy of this date with the specified duration added.
481     * <p>
482     * If the amount is zero, then <code>this</code> is returned.
483     * 
484     * @param duration  the duration, in millis, to add to this one
485     * @return a copy of this datetime with the duration added
486     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
487     */
488    public DateMidnight plus(long duration) {
489        return withDurationAdded(duration, 1);
490    }
491 
492    /**
493     * Returns a copy of this date with the specified duration added.
494     * <p>
495     * If the amount is zero or null, then <code>this</code> is returned.
496     * 
497     * @param duration  the duration to add to this one, null means zero
498     * @return a copy of this datetime with the duration added
499     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
500     */
501    public DateMidnight plus(ReadableDuration duration) {
502        return withDurationAdded(duration, 1);
503    }
504 
505    /**
506     * Returns a copy of this date with the specified period added.
507     * <p>
508     * If the amount is zero or null, then <code>this</code> is returned.
509     * <p>
510     * This method is typically used to add complex period instances.
511     * Adding one field is best achieved using methods
512     * like {@link #plusYears(int)}.
513     * 
514     * @param period  the duration to add to this one, null means zero
515     * @return a copy of this datetime with the period added
516     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
517     */
518    public DateMidnight plus(ReadablePeriod period) {
519        return withPeriodAdded(period, 1);
520    }
521 
522    //-----------------------------------------------------------------------
523    /**
524     * Returns a copy of this date plus the specified number of years.
525     * <p>
526     * This datetime instance is immutable and unaffected by this method call.
527     * <p>
528     * The following three lines are identical in effect:
529     * <pre>
530     * DateMidnight added = dt.plusYears(6);
531     * DateMidnight added = dt.plus(Period.years(6));
532     * DateMidnight added = dt.withFieldAdded(DurationFieldType.years(), 6);
533     * </pre>
534     *
535     * @param years  the amount of years to add, may be negative
536     * @return the new datetime plus the increased years
537     * @since 1.1
538     */
539    public DateMidnight plusYears(int years) {
540        if (years == 0) {
541            return this;
542        }
543        long instant = getChronology().years().add(getMillis(), years);
544        return withMillis(instant);
545    }
546 
547    /**
548     * Returns a copy of this date plus the specified number of months.
549     * <p>
550     * This datetime instance is immutable and unaffected by this method call.
551     * <p>
552     * The following three lines are identical in effect:
553     * <pre>
554     * DateMidnight added = dt.plusMonths(6);
555     * DateMidnight added = dt.plus(Period.months(6));
556     * DateMidnight added = dt.withFieldAdded(DurationFieldType.months(), 6);
557     * </pre>
558     *
559     * @param months  the amount of months to add, may be negative
560     * @return the new datetime plus the increased months
561     * @since 1.1
562     */
563    public DateMidnight plusMonths(int months) {
564        if (months == 0) {
565            return this;
566        }
567        long instant = getChronology().months().add(getMillis(), months);
568        return withMillis(instant);
569    }
570 
571    /**
572     * Returns a copy of this date plus the specified number of weeks.
573     * <p>
574     * This datetime instance is immutable and unaffected by this method call.
575     * <p>
576     * The following three lines are identical in effect:
577     * <pre>
578     * DateMidnight added = dt.plusWeeks(6);
579     * DateMidnight added = dt.plus(Period.weeks(6));
580     * DateMidnight added = dt.withFieldAdded(DurationFieldType.weeks(), 6);
581     * </pre>
582     *
583     * @param weeks  the amount of weeks to add, may be negative
584     * @return the new datetime plus the increased weeks
585     * @since 1.1
586     */
587    public DateMidnight plusWeeks(int weeks) {
588        if (weeks == 0) {
589            return this;
590        }
591        long instant = getChronology().weeks().add(getMillis(), weeks);
592        return withMillis(instant);
593    }
594 
595    /**
596     * Returns a copy of this date plus the specified number of days.
597     * <p>
598     * This datetime instance is immutable and unaffected by this method call.
599     * <p>
600     * The following three lines are identical in effect:
601     * <pre>
602     * DateMidnight added = dt.plusDays(6);
603     * DateMidnight added = dt.plus(Period.days(6));
604     * DateMidnight added = dt.withFieldAdded(DurationFieldType.days(), 6);
605     * </pre>
606     *
607     * @param days  the amount of days to add, may be negative
608     * @return the new datetime plus the increased days
609     * @since 1.1
610     */
611    public DateMidnight plusDays(int days) {
612        if (days == 0) {
613            return this;
614        }
615        long instant = getChronology().days().add(getMillis(), days);
616        return withMillis(instant);
617    }
618 
619    //-----------------------------------------------------------------------
620    /**
621     * Returns a copy of this date with the specified duration taken away.
622     * <p>
623     * If the amount is zero or null, then <code>this</code> is returned.
624     * 
625     * @param duration  the duration, in millis, to reduce this instant by
626     * @return a copy of this datetime with the duration taken away
627     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
628     */
629    public DateMidnight minus(long duration) {
630        return withDurationAdded(duration, -1);
631    }
632 
633    /**
634     * Returns a copy of this date with the specified duration taken away.
635     * <p>
636     * If the amount is zero or null, then <code>this</code> is returned.
637     * 
638     * @param duration  the duration to reduce this instant by
639     * @return a copy of this datetime with the duration taken away
640     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
641     */
642    public DateMidnight minus(ReadableDuration duration) {
643        return withDurationAdded(duration, -1);
644    }
645 
646    /**
647     * Returns a copy of this date with the specified period taken away.
648     * <p>
649     * If the amount is zero or null, then <code>this</code> is returned.
650     * <p>
651     * This method is typically used to subtract complex period instances.
652     * Subtracting one field is best achieved using methods
653     * like {@link #minusYears(int)}.
654     * 
655     * @param period  the period to reduce this instant by
656     * @return a copy of this datetime with the period taken away
657     * @throws ArithmeticException if the new datetime exceeds the capacity of a long
658     */
659    public DateMidnight minus(ReadablePeriod period) {
660        return withPeriodAdded(period, -1);
661    }
662 
663    //-----------------------------------------------------------------------
664    /**
665     * Returns a copy of this date minus the specified number of years.
666     * <p>
667     * This datetime instance is immutable and unaffected by this method call.
668     * <p>
669     * The following three lines are identical in effect:
670     * <pre>
671     * DateTime subtracted = dt.minusYears(6);
672     * DateTime subtracted = dt.minus(Period.years(6));
673     * DateTime subtracted = dt.withFieldAdded(DurationFieldType.years(), -6);
674     * </pre>
675     *
676     * @param years  the amount of years to subtract, may be negative
677     * @return the new datetime minus the increased years
678     * @since 1.1
679     */
680    public DateMidnight minusYears(int years) {
681        if (years == 0) {
682            return this;
683        }
684        long instant = getChronology().years().subtract(getMillis(), years);
685        return withMillis(instant);
686    }
687 
688    /**
689     * Returns a copy of this date minus the specified number of months.
690     * <p>
691     * This datetime instance is immutable and unaffected by this method call.
692     * <p>
693     * The following three lines are identical in effect:
694     * <pre>
695     * DateMidnight subtracted = dt.minusMonths(6);
696     * DateMidnight subtracted = dt.minus(Period.months(6));
697     * DateMidnight subtracted = dt.withFieldAdded(DurationFieldType.months(), -6);
698     * </pre>
699     *
700     * @param months  the amount of months to subtract, may be negative
701     * @return the new datetime minus the increased months
702     * @since 1.1
703     */
704    public DateMidnight minusMonths(int months) {
705        if (months == 0) {
706            return this;
707        }
708        long instant = getChronology().months().subtract(getMillis(), months);
709        return withMillis(instant);
710    }
711 
712    /**
713     * Returns a copy of this date minus the specified number of weeks.
714     * <p>
715     * This datetime instance is immutable and unaffected by this method call.
716     * <p>
717     * The following three lines are identical in effect:
718     * <pre>
719     * DateMidnight subtracted = dt.minusWeeks(6);
720     * DateMidnight subtracted = dt.minus(Period.weeks(6));
721     * DateMidnight subtracted = dt.withFieldAdded(DurationFieldType.weeks(), -6);
722     * </pre>
723     *
724     * @param weeks  the amount of weeks to subtract, may be negative
725     * @return the new datetime minus the increased weeks
726     * @since 1.1
727     */
728    public DateMidnight minusWeeks(int weeks) {
729        if (weeks == 0) {
730            return this;
731        }
732        long instant = getChronology().weeks().subtract(getMillis(), weeks);
733        return withMillis(instant);
734    }
735 
736    /**
737     * Returns a copy of this date minus the specified number of days.
738     * <p>
739     * This datetime instance is immutable and unaffected by this method call.
740     * <p>
741     * The following three lines are identical in effect:
742     * <pre>
743     * DateMidnight subtracted = dt.minusDays(6);
744     * DateMidnight subtracted = dt.minus(Period.days(6));
745     * DateMidnight subtracted = dt.withFieldAdded(DurationFieldType.days(), -6);
746     * </pre>
747     *
748     * @param days  the amount of days to subtract, may be negative
749     * @return the new datetime minus the increased days
750     * @since 1.1
751     */
752    public DateMidnight minusDays(int days) {
753        if (days == 0) {
754            return this;
755        }
756        long instant = getChronology().days().subtract(getMillis(), days);
757        return withMillis(instant);
758    }
759 
760    //-----------------------------------------------------------------------
761    /**
762     * Gets the property object for the specified type, which contains many useful methods.
763     *
764     * @param type  the field type to get the chronology for
765     * @return the property object
766     * @throws IllegalArgumentException if the field is null or unsupported
767     */
768    public Property property(DateTimeFieldType type) {
769        if (type == null) {
770            throw new IllegalArgumentException("The DateTimeFieldType must not be null");
771        }
772        DateTimeField field = type.getField(getChronology());
773        if (field.isSupported() == false) {
774            throw new IllegalArgumentException("Field '" + type + "' is not supported");
775        }
776        return new Property(this, field);
777    }
778 
779    //-----------------------------------------------------------------------
780    /**
781     * Converts this object to a <code>YearMonthDay</code> using the
782     * same date and chronology.
783     * 
784     * @return a YearMonthDay using the same millis and chronology
785     * @deprecated Use LocalDate instead of YearMonthDay
786     */
787    public YearMonthDay toYearMonthDay() {
788        return new YearMonthDay(getMillis(), getChronology());
789    }
790 
791    /**
792     * Converts this object to a <code>LocalDate</code> with the
793     * same date and chronology.
794     *
795     * @return a LocalDate with the same date and chronology
796     * @since 1.3
797     */
798    public LocalDate toLocalDate() {
799        return new LocalDate(getMillis(), getChronology());
800    }
801 
802    /**
803     * Converts this object to an <code>Interval</code> encompassing
804     * the whole of this day.
805     * <p>
806     * The interval starts at midnight 00:00 and ends at 00:00 the following day,
807     * (which is not included in the interval, as intervals are half-open).
808     * 
809     * @return an interval over the day
810     */
811    public Interval toInterval() {
812        Chronology chrono = getChronology();
813        long start = getMillis();
814        long end = DurationFieldType.days().getField(chrono).add(start, 1);
815        return new Interval(start, end, chrono);
816    }
817 
818    //-----------------------------------------------------------------------
819    /**
820     * Returns a copy of this date with the era field updated.
821     * <p>
822     * DateMidnight is immutable, so there are no set methods.
823     * Instead, this method returns a new instance with the value of
824     * era changed.
825     *
826     * @param era  the era to set
827     * @return a copy of this object with the field set
828     * @throws IllegalArgumentException if the value is invalid
829     * @since 1.3
830     */
831    public DateMidnight withEra(int era) {
832        return withMillis(getChronology().era().set(getMillis(), era));
833    }
834 
835    /**
836     * Returns a copy of this date with the century of era field updated.
837     * <p>
838     * DateMidnight is immutable, so there are no set methods.
839     * Instead, this method returns a new instance with the value of
840     * century of era changed.
841     *
842     * @param centuryOfEra  the centurey of era to set
843     * @return a copy of this object with the field set
844     * @throws IllegalArgumentException if the value is invalid
845     * @since 1.3
846     */
847    public DateMidnight withCenturyOfEra(int centuryOfEra) {
848        return withMillis(getChronology().centuryOfEra().set(getMillis(), centuryOfEra));
849    }
850 
851    /**
852     * Returns a copy of this date with the year of era field updated.
853     * <p>
854     * DateMidnight is immutable, so there are no set methods.
855     * Instead, this method returns a new instance with the value of
856     * year of era changed.
857     *
858     * @param yearOfEra  the year of era to set
859     * @return a copy of this object with the field set
860     * @throws IllegalArgumentException if the value is invalid
861     * @since 1.3
862     */
863    public DateMidnight withYearOfEra(int yearOfEra) {
864        return withMillis(getChronology().yearOfEra().set(getMillis(), yearOfEra));
865    }
866 
867    /**
868     * Returns a copy of this date with the year of century field updated.
869     * <p>
870     * DateMidnight is immutable, so there are no set methods.
871     * Instead, this method returns a new instance with the value of
872     * year of century changed.
873     *
874     * @param yearOfCentury  the year of century to set
875     * @return a copy of this object with the field set
876     * @throws IllegalArgumentException if the value is invalid
877     * @since 1.3
878     */
879    public DateMidnight withYearOfCentury(int yearOfCentury) {
880        return withMillis(getChronology().yearOfCentury().set(getMillis(), yearOfCentury));
881    }
882 
883    /**
884     * Returns a copy of this date with the year field updated.
885     * <p>
886     * DateMidnight is immutable, so there are no set methods.
887     * Instead, this method returns a new instance with the value of
888     * year changed.
889     *
890     * @param year  the year to set
891     * @return a copy of this object with the field set
892     * @throws IllegalArgumentException if the value is invalid
893     * @since 1.3
894     */
895    public DateMidnight withYear(int year) {
896        return withMillis(getChronology().year().set(getMillis(), year));
897    }
898 
899    /**
900     * Returns a copy of this date with the weekyear field updated.
901     * <p>
902     * DateMidnight is immutable, so there are no set methods.
903     * Instead, this method returns a new instance with the value of
904     * weekyear changed.
905     *
906     * @param weekyear  the weekyear to set
907     * @return a copy of this object with the field set
908     * @throws IllegalArgumentException if the value is invalid
909     * @since 1.3
910     */
911    public DateMidnight withWeekyear(int weekyear) {
912        return withMillis(getChronology().weekyear().set(getMillis(), weekyear));
913    }
914 
915    /**
916     * Returns a copy of this date with the month of year field updated.
917     * <p>
918     * DateMidnight is immutable, so there are no set methods.
919     * Instead, this method returns a new instance with the value of
920     * month of year changed.
921     *
922     * @param monthOfYear  the month of year to set
923     * @return a copy of this object with the field set
924     * @throws IllegalArgumentException if the value is invalid
925     * @since 1.3
926     */
927    public DateMidnight withMonthOfYear(int monthOfYear) {
928        return withMillis(getChronology().monthOfYear().set(getMillis(), monthOfYear));
929    }
930 
931    /**
932     * Returns a copy of this date with the week of weekyear field updated.
933     * <p>
934     * DateMidnight is immutable, so there are no set methods.
935     * Instead, this method returns a new instance with the value of
936     * week of weekyear changed.
937     *
938     * @param weekOfWeekyear  the week of weekyear to set
939     * @return a copy of this object with the field set
940     * @throws IllegalArgumentException if the value is invalid
941     * @since 1.3
942     */
943    public DateMidnight withWeekOfWeekyear(int weekOfWeekyear) {
944        return withMillis(getChronology().weekOfWeekyear().set(getMillis(), weekOfWeekyear));
945    }
946 
947    /**
948     * Returns a copy of this date with the day of year field updated.
949     * <p>
950     * DateMidnight is immutable, so there are no set methods.
951     * Instead, this method returns a new instance with the value of
952     * day of year changed.
953     *
954     * @param dayOfYear  the day of year to set
955     * @return a copy of this object with the field set
956     * @throws IllegalArgumentException if the value is invalid
957     * @since 1.3
958     */
959    public DateMidnight withDayOfYear(int dayOfYear) {
960        return withMillis(getChronology().dayOfYear().set(getMillis(), dayOfYear));
961    }
962 
963    /**
964     * Returns a copy of this date with the day of month field updated.
965     * <p>
966     * DateMidnight is immutable, so there are no set methods.
967     * Instead, this method returns a new instance with the value of
968     * day of month changed.
969     *
970     * @param dayOfMonth  the day of month to set
971     * @return a copy of this object with the field set
972     * @throws IllegalArgumentException if the value is invalid
973     * @since 1.3
974     */
975    public DateMidnight withDayOfMonth(int dayOfMonth) {
976        return withMillis(getChronology().dayOfMonth().set(getMillis(), dayOfMonth));
977    }
978 
979    /**
980     * Returns a copy of this date with the day of week field updated.
981     * <p>
982     * DateMidnight is immutable, so there are no set methods.
983     * Instead, this method returns a new instance with the value of
984     * day of week changed.
985     *
986     * @param dayOfWeek  the day of week to set
987     * @return a copy of this object with the field set
988     * @throws IllegalArgumentException if the value is invalid
989     * @since 1.3
990     */
991    public DateMidnight withDayOfWeek(int dayOfWeek) {
992        return withMillis(getChronology().dayOfWeek().set(getMillis(), dayOfWeek));
993    }
994 
995    // Date properties
996    //-----------------------------------------------------------------------
997    /**
998     * Get the era property which provides access to advanced functionality.
999     * 
1000     * @return the era property
1001     */
1002    public Property era() {
1003        return new Property(this, getChronology().era());
1004    }
1005 
1006    /**
1007     * Get the century of era property which provides access to advanced functionality.
1008     * 
1009     * @return the year of era property
1010     */
1011    public Property centuryOfEra() {
1012        return new Property(this, getChronology().centuryOfEra());
1013    }
1014 
1015    /**
1016     * Get the year of century property which provides access to advanced functionality.
1017     * 
1018     * @return the year of era property
1019     */
1020    public Property yearOfCentury() {
1021        return new Property(this, getChronology().yearOfCentury());
1022    }
1023 
1024    /**
1025     * Get the year of era property which provides access to advanced functionality.
1026     * 
1027     * @return the year of era property
1028     */
1029    public Property yearOfEra() {
1030        return new Property(this, getChronology().yearOfEra());
1031    }
1032 
1033    /**
1034     * Get the year property which provides access to advanced functionality.
1035     * 
1036     * @return the year property
1037     */
1038    public Property year() {
1039        return new Property(this, getChronology().year());
1040    }
1041 
1042    /**
1043     * Get the year of a week based year property which provides access to advanced functionality.
1044     * 
1045     * @return the year of a week based year property
1046     */
1047    public Property weekyear() {
1048        return new Property(this, getChronology().weekyear());
1049    }
1050 
1051    /**
1052     * Get the month of year property which provides access to advanced functionality.
1053     * 
1054     * @return the month of year property
1055     */
1056    public Property monthOfYear() {
1057        return new Property(this, getChronology().monthOfYear());
1058    }
1059 
1060    /**
1061     * Get the week of a week based year property which provides access to advanced functionality.
1062     * 
1063     * @return the week of a week based year property
1064     */
1065    public Property weekOfWeekyear() {
1066        return new Property(this, getChronology().weekOfWeekyear());
1067    }
1068 
1069    /**
1070     * Get the day of year property which provides access to advanced functionality.
1071     * 
1072     * @return the day of year property
1073     */
1074    public Property dayOfYear() {
1075        return new Property(this, getChronology().dayOfYear());
1076    }
1077 
1078    /**
1079     * Get the day of month property which provides access to advanced functionality.
1080     * 
1081     * @return the day of month property
1082     */
1083    public Property dayOfMonth() {
1084        return new Property(this, getChronology().dayOfMonth());
1085    }
1086 
1087    /**
1088     * Get the day of week property which provides access to advanced functionality.
1089     * 
1090     * @return the day of week property
1091     */
1092    public Property dayOfWeek() {
1093        return new Property(this, getChronology().dayOfWeek());
1094    }
1095 
1096    //-----------------------------------------------------------------------
1097    /**
1098     * DateMidnight.Property binds a DateMidnight to a DateTimeField allowing powerful
1099     * datetime functionality to be easily accessed.
1100     * <p>
1101     * The simplest use of this class is as an alternative get method, here used to
1102     * get the year '1972' (as an int) and the month 'December' (as a String).
1103     * <pre>
1104     * DateMidnight dt = new DateMidnight(1972, 12, 3);
1105     * int year = dt.year().get();
1106     * String monthStr = dt.monthOfYear().getAsText();
1107     * </pre>
1108     * <p>
1109     * Methods are also provided that allow date modification. These return new instances
1110     * of DateMidnight - they do not modify the original. The example below yields two
1111     * independent immutable date objects 20 years apart.
1112     * <pre>
1113     * DateMidnight dt = new DateMidnight(1972, 12, 3);
1114     * DateMidnight dt20 = dt.year().addToCopy(20);
1115     * </pre>
1116     * Serious modification of dates (ie. more than just changing one or two fields)
1117     * should use the {@link org.joda.time.MutableDateTime MutableDateTime} class.
1118     * <p>
1119     * DateMidnight.Property itself is thread-safe and immutable.
1120     *
1121     * @author Stephen Colebourne
1122     * @author Brian S O'Neill
1123     * @since 1.0
1124     */
1125    public static final class Property extends AbstractReadableInstantFieldProperty {
1126    
1127        /** Serialization lock */
1128        private static final long serialVersionUID = 257629620L;
1129        
1130        /** The instant this property is working against */
1131        private DateMidnight iInstant;
1132        /** The field this property is working against */
1133        private DateTimeField iField;
1134        
1135        /**
1136         * Constructor.
1137         * 
1138         * @param instant  the instant to set
1139         * @param field  the field to use
1140         */
1141        Property(DateMidnight instant, DateTimeField field) {
1142            super();
1143            iInstant = instant;
1144            iField = field;
1145        }
1146 
1147        /**
1148         * Writes the property in a safe serialization format.
1149         */
1150        private void writeObject(ObjectOutputStream oos) throws IOException {
1151            oos.writeObject(iInstant);
1152            oos.writeObject(iField.getType());
1153        }
1154 
1155        /**
1156         * Reads the property from a safe serialization format.
1157         */
1158        private void readObject(ObjectInputStream oos) throws IOException, ClassNotFoundException {
1159            iInstant = (DateMidnight) oos.readObject();
1160            DateTimeFieldType type = (DateTimeFieldType) oos.readObject();
1161            iField = type.getField(iInstant.getChronology());
1162        }
1163 
1164        //-----------------------------------------------------------------------
1165        /**
1166         * Gets the field being used.
1167         * 
1168         * @return the field
1169         */
1170        public DateTimeField getField() {
1171            return iField;
1172        }
1173 
1174        /**
1175         * Gets the milliseconds of the datetime that this property is linked to.
1176         * 
1177         * @return the milliseconds
1178         */
1179        protected long getMillis() {
1180            return iInstant.getMillis();
1181        }
1182 
1183        /**
1184         * Gets the chronology of the datetime that this property is linked to.
1185         * 
1186         * @return the chronology
1187         * @since 1.4
1188         */
1189        protected Chronology getChronology() {
1190            return iInstant.getChronology();
1191        }
1192 
1193        /**
1194         * Gets the datetime being used.
1195         * 
1196         * @return the datetime
1197         */
1198        public DateMidnight getDateMidnight() {
1199            return iInstant;
1200        }
1201 
1202        //-----------------------------------------------------------------------
1203        /**
1204         * Adds to this field in a copy of this DateMidnight.
1205         * <p>
1206         * The DateMidnight attached to this property is unchanged by this call.
1207         * This operation is faster than converting a DateMidnight to a MutableDateTime
1208         * and back again when setting one field. When setting multiple fields,
1209         * it is generally quicker to make the conversion to MutableDateTime.
1210         * 
1211         * @param value  the value to add to the field in the copy
1212         * @return a copy of the DateMidnight with the field value changed
1213         * @throws IllegalArgumentException if the value isn't valid
1214         */
1215        public DateMidnight addToCopy(int value) {
1216            return iInstant.withMillis(iField.add(iInstant.getMillis(), value));
1217        }
1218 
1219        /**
1220         * Adds to this field in a copy of this DateMidnight.
1221         * <p>
1222         * The DateMidnight attached to this property is unchanged by this call.
1223         * This operation is faster than converting a DateMidnight to a MutableDateTime
1224         * and back again when setting one field. When setting multiple fields,
1225         * it is generally quicker to make the conversion to MutableDateTime.
1226         * 
1227         * @param value  the value to add to the field in the copy
1228         * @return a copy of the DateMidnight with the field value changed
1229         * @throws IllegalArgumentException if the value isn't valid
1230         */
1231        public DateMidnight addToCopy(long value) {
1232            return iInstant.withMillis(iField.add(iInstant.getMillis(), value));
1233        }
1234 
1235        /**
1236         * Adds to this field, possibly wrapped, in a copy of this DateMidnight.
1237         * A wrapped operation only changes this field.
1238         * Thus 31st January addWrapField one day goes to the 1st January.
1239         * <p>
1240         * The DateMidnight attached to this property is unchanged by this call.
1241         * This operation is faster than converting a DateMidnight to a MutableDateTime
1242         * and back again when setting one field. When setting multiple fields,
1243         * it is generally quicker to make the conversion to MutableDateTime.
1244         * 
1245         * @param value  the value to add to the field in the copy
1246         * @return a copy of the DateMidnight with the field value changed
1247         * @throws IllegalArgumentException if the value isn't valid
1248         */
1249        public DateMidnight addWrapFieldToCopy(int value) {
1250            return iInstant.withMillis(iField.addWrapField(iInstant.getMillis(), value));
1251        }
1252 
1253        //-----------------------------------------------------------------------
1254        /**
1255         * Sets this field in a copy of the DateMidnight.
1256         * <p>
1257         * The DateMidnight attached to this property is unchanged by this call.
1258         * This operation is faster than converting a DateMidnight to a MutableDateTime
1259         * and back again when setting one field. When setting multiple fields,
1260         * it is generally quicker to make the conversion to MutableDateTime.
1261         * 
1262         * @param value  the value to set the field in the copy to
1263         * @return a copy of the DateMidnight with the field value changed
1264         * @throws IllegalArgumentException if the value isn't valid
1265         */
1266        public DateMidnight setCopy(int value) {
1267            return iInstant.withMillis(iField.set(iInstant.getMillis(), value));
1268        }
1269    
1270        /**
1271         * Sets this field in a copy of the DateMidnight to a parsed text value.
1272         * <p>
1273         * The DateMidnight attached to this property is unchanged by this call.
1274         * This operation is faster than converting a DateMidnight to a MutableDateTime
1275         * and back again when setting one field. When setting multiple fields,
1276         * it is generally quicker to make the conversion to MutableDateTime.
1277         * 
1278         * @param text  the text value to set
1279         * @param locale  optional locale to use for selecting a text symbol
1280         * @return a copy of the DateMidnight with the field value changed
1281         * @throws IllegalArgumentException if the text value isn't valid
1282         */
1283        public DateMidnight setCopy(String text, Locale locale) {
1284            return iInstant.withMillis(iField.set(iInstant.getMillis(), text, locale));
1285        }
1286 
1287        /**
1288         * Sets this field in a copy of the DateMidnight to a parsed text value.
1289         * <p>
1290         * The DateMidnight attached to this property is unchanged by this call.
1291         * This operation is faster than converting a DateMidnight to a MutableDateTime
1292         * and back again when setting one field. When setting multiple fields,
1293         * it is generally quicker to make the conversion to MutableDateTime.
1294         * 
1295         * @param text  the text value to set
1296         * @return a copy of the DateMidnight with the field value changed
1297         * @throws IllegalArgumentException if the text value isn't valid
1298         */
1299        public DateMidnight setCopy(String text) {
1300            return setCopy(text, null);
1301        }
1302 
1303        //-----------------------------------------------------------------------
1304        /**
1305         * Returns a new DateMidnight with this field set to the maximum value
1306         * for this field.
1307         * <p>
1308         * This operation is useful for obtaining a DateTime on the last day
1309         * of the month, as month lengths vary.
1310         * <pre>
1311         * DateMidnight lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
1312         * </pre>
1313         * <p>
1314         * The DateMidnight attached to this property is unchanged by this call.
1315         *
1316         * @return a copy of the DateMidnight with this field set to its maximum
1317         * @since 1.2
1318         */
1319        public DateMidnight withMaximumValue() {
1320            return setCopy(getMaximumValue());
1321        }
1322        
1323        /**
1324         * Returns a new DateMidnight with this field set to the minimum value
1325         * for this field.
1326         * <p>
1327         * The DateMidnight attached to this property is unchanged by this call.
1328         *
1329         * @return a copy of the DateMidnight with this field set to its minimum
1330         * @since 1.2
1331         */
1332        public DateMidnight withMinimumValue() {
1333            return setCopy(getMinimumValue());
1334        }
1335        
1336        //-----------------------------------------------------------------------
1337        /**
1338         * Rounds to the lowest whole unit of this field on a copy of this DateMidnight.
1339         *
1340         * @return a copy of the DateMidnight with the field value changed
1341         */
1342        public DateMidnight roundFloorCopy() {
1343            return iInstant.withMillis(iField.roundFloor(iInstant.getMillis()));
1344        }
1345 
1346        /**
1347         * Rounds to the highest whole unit of this field on a copy of this DateMidnight.
1348         *
1349         * @return a copy of the DateMidnight with the field value changed
1350         */
1351        public DateMidnight roundCeilingCopy() {
1352            return iInstant.withMillis(iField.roundCeiling(iInstant.getMillis()));
1353        }
1354 
1355        /**
1356         * Rounds to the nearest whole unit of this field on a copy of this DateMidnight,
1357         * favoring the floor if halfway.
1358         *
1359         * @return a copy of the DateMidnight with the field value changed
1360         */
1361        public DateMidnight roundHalfFloorCopy() {
1362            return iInstant.withMillis(iField.roundHalfFloor(iInstant.getMillis()));
1363        }
1364 
1365        /**
1366         * Rounds to the nearest whole unit of this field on a copy of this DateMidnight,
1367         * favoring the ceiling if halfway.
1368         *
1369         * @return a copy of the DateMidnight with the field value changed
1370         */
1371        public DateMidnight roundHalfCeilingCopy() {
1372            return iInstant.withMillis(iField.roundHalfCeiling(iInstant.getMillis()));
1373        }
1374 
1375        /**
1376         * Rounds to the nearest whole unit of this field on a copy of this DateMidnight.
1377         * If halfway, the ceiling is favored over the floor only if it makes this field's value even.
1378         *
1379         * @return a copy of the DateMidnight with the field value changed
1380         */
1381        public DateMidnight roundHalfEvenCopy() {
1382            return iInstant.withMillis(iField.roundHalfEven(iInstant.getMillis()));
1383        }
1384 
1385    }
1386}

[all classes][org.joda.time]
EMMA 2.0.5312 (C) Vladimir Roubtsov