1
16 package org.joda.time.chrono;
17
18 import java.util.Locale;
19
20 import org.joda.time.DateTimeConstants;
21 import org.joda.time.DateTimeFieldType;
22 import org.joda.time.DurationField;
23 import org.joda.time.DurationFieldType;
24 import org.joda.time.field.BaseDateTimeField;
25 import org.joda.time.field.FieldUtils;
26 import org.joda.time.field.UnsupportedDurationField;
27
28
35 final class GJEraDateTimeField extends BaseDateTimeField {
36
37
38 @SuppressWarnings("unused")
39 private static final long serialVersionUID = 4240986525305515528L;
40
41 private final BasicChronology iChronology;
42
43
46 GJEraDateTimeField(BasicChronology chronology) {
47 super(DateTimeFieldType.era());
48 iChronology = chronology;
49 }
50
51 public boolean isLenient() {
52 return false;
53 }
54
55
60 public int get(long instant) {
61 if (iChronology.getYear(instant) <= 0) {
62 return DateTimeConstants.BCE;
63 } else {
64 return DateTimeConstants.CE;
65 }
66 }
67
68 public String getAsText(int fieldValue, Locale locale) {
69 return GJLocaleSymbols.forLocale(locale).eraValueToText(fieldValue);
70 }
71
72
80 public long set(long instant, int era) {
81 FieldUtils.verifyValueBounds(this, era, DateTimeConstants.BCE, DateTimeConstants.CE);
82
83 int oldEra = get(instant);
84 if (oldEra != era) {
85 int year = iChronology.getYear(instant);
86 return iChronology.setYear(instant, -year);
87 } else {
88 return instant;
89 }
90 }
91
92 public long set(long instant, String text, Locale locale) {
93 return set(instant, GJLocaleSymbols.forLocale(locale).eraTextToValue(text));
94 }
95
96 public long roundFloor(long instant) {
97 if (get(instant) == DateTimeConstants.CE) {
98 return iChronology.setYear(0, 1);
99 } else {
100 return Long.MIN_VALUE;
101 }
102 }
103
104 public long roundCeiling(long instant) {
105 if (get(instant) == DateTimeConstants.BCE) {
106 return iChronology.setYear(0, 1);
107 } else {
108 return Long.MAX_VALUE;
109 }
110 }
111
112 public long roundHalfFloor(long instant) {
113
114 return roundFloor(instant);
115 }
116
117 public long roundHalfCeiling(long instant) {
118
119 return roundFloor(instant);
120 }
121
122 public long roundHalfEven(long instant) {
123
124 return roundFloor(instant);
125 }
126
127 public DurationField getDurationField() {
128 return UnsupportedDurationField.getInstance(DurationFieldType.eras());
129 }
130
131 public DurationField getRangeDurationField() {
132 return null;
133 }
134
135 public int getMinimumValue() {
136 return DateTimeConstants.BCE;
137 }
138
139 public int getMaximumValue() {
140 return DateTimeConstants.CE;
141 }
142
143 public int getMaximumTextLength(Locale locale) {
144 return GJLocaleSymbols.forLocale(locale).getEraMaxTextLength();
145 }
146
147
150 private Object readResolve() {
151 return iChronology.era();
152 }
153 }
154