001: /*
002: * Copyright 2001-2005 Stephen Colebourne
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.joda.time.chrono;
017:
018: import org.joda.time.DateTimeFieldType;
019: import org.joda.time.DurationField;
020: import org.joda.time.field.FieldUtils;
021: import org.joda.time.field.ImpreciseDateTimeField;
022:
023: /**
024: * A year field suitable for many calendars.
025: *
026: * @author Guy Allard
027: * @author Stephen Colebourne
028: * @author Brian S O'Neill
029: * @since 1.1, refactored from GJYearDateTimeField
030: */
031: class BasicYearDateTimeField extends ImpreciseDateTimeField {
032:
033: /** Serialization version. */
034: private static final long serialVersionUID = -98628754872287L;
035:
036: /** The underlying basic chronology. */
037: protected final BasicChronology iChronology;
038:
039: /**
040: * Restricted constructor.
041: *
042: * @param chronology the chronology this field belogs to
043: */
044: BasicYearDateTimeField(BasicChronology chronology) {
045: super (DateTimeFieldType.year(), chronology
046: .getAverageMillisPerYear());
047: iChronology = chronology;
048: }
049:
050: public boolean isLenient() {
051: return false;
052: }
053:
054: public int get(long instant) {
055: return iChronology.getYear(instant);
056: }
057:
058: public long add(long instant, int years) {
059: if (years == 0) {
060: return instant;
061: }
062: int this Year = get(instant);
063: int newYear = FieldUtils.safeAdd(this Year, years);
064: return set(instant, newYear);
065: }
066:
067: public long add(long instant, long years) {
068: return add(instant, FieldUtils.safeToInt(years));
069: }
070:
071: public long addWrapField(long instant, int years) {
072: if (years == 0) {
073: return instant;
074: }
075: // Return newly calculated millis value
076: int this Year = iChronology.getYear(instant);
077: int wrappedYear = FieldUtils.getWrappedValue(this Year, years,
078: iChronology.getMinYear(), iChronology.getMaxYear());
079: return set(instant, wrappedYear);
080: }
081:
082: public long set(long instant, int year) {
083: FieldUtils.verifyValueBounds(this , year, iChronology
084: .getMinYear(), iChronology.getMaxYear());
085: return iChronology.setYear(instant, year);
086: }
087:
088: public long getDifferenceAsLong(long minuendInstant,
089: long subtrahendInstant) {
090: if (minuendInstant < subtrahendInstant) {
091: return -iChronology.getYearDifference(subtrahendInstant,
092: minuendInstant);
093: }
094: return iChronology.getYearDifference(minuendInstant,
095: subtrahendInstant);
096: }
097:
098: public DurationField getRangeDurationField() {
099: return null;
100: }
101:
102: public boolean isLeap(long instant) {
103: return iChronology.isLeapYear(get(instant));
104: }
105:
106: public int getLeapAmount(long instant) {
107: if (iChronology.isLeapYear(get(instant))) {
108: return 1;
109: } else {
110: return 0;
111: }
112: }
113:
114: public DurationField getLeapDurationField() {
115: return iChronology.days();
116: }
117:
118: public int getMinimumValue() {
119: return iChronology.getMinYear();
120: }
121:
122: public int getMaximumValue() {
123: return iChronology.getMaxYear();
124: }
125:
126: public long roundFloor(long instant) {
127: return iChronology.getYearMillis(get(instant));
128: }
129:
130: public long roundCeiling(long instant) {
131: int year = get(instant);
132: long yearStartMillis = iChronology.getYearMillis(year);
133: if (instant != yearStartMillis) {
134: // Bump up to start of next year.
135: instant = iChronology.getYearMillis(year + 1);
136: }
137: return instant;
138: }
139:
140: public long remainder(long instant) {
141: return instant - roundFloor(instant);
142: }
143:
144: /**
145: * Serialization singleton
146: */
147: private Object readResolve() {
148: return iChronology.year();
149: }
150: }
|