1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.joda.time.base;
17
18 import java.io.Serializable;
19
20 import org.joda.time.Chronology;
21 import org.joda.time.DateTimeUtils;
22 import org.joda.time.MutableInterval;
23 import org.joda.time.ReadWritableInterval;
24 import org.joda.time.ReadableDuration;
25 import org.joda.time.ReadableInstant;
26 import org.joda.time.ReadableInterval;
27 import org.joda.time.ReadablePeriod;
28 import org.joda.time.chrono.ISOChronology;
29 import org.joda.time.convert.ConverterManager;
30 import org.joda.time.convert.IntervalConverter;
31 import org.joda.time.field.FieldUtils;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public abstract class BaseInterval
49 extends AbstractInterval
50 implements ReadableInterval, Serializable {
51
52
53 private static final long serialVersionUID = 576586928732749278L;
54
55
56 private volatile Chronology iChronology;
57
58 private volatile long iStartMillis;
59
60 private volatile long iEndMillis;
61
62
63
64
65
66
67
68
69
70 protected BaseInterval(long startInstant, long endInstant, Chronology chrono) {
71 super();
72 iChronology = DateTimeUtils.getChronology(chrono);
73 checkInterval(startInstant, endInstant);
74 iStartMillis = startInstant;
75 iEndMillis = endInstant;
76 }
77
78
79
80
81
82
83
84
85 protected BaseInterval(ReadableInstant start, ReadableInstant end) {
86 super();
87 if (start == null && end == null) {
88 iStartMillis = iEndMillis = DateTimeUtils.currentTimeMillis();
89 iChronology = ISOChronology.getInstance();
90 } else {
91 iChronology = DateTimeUtils.getInstantChronology(start);
92 iStartMillis = DateTimeUtils.getInstantMillis(start);
93 iEndMillis = DateTimeUtils.getInstantMillis(end);
94 checkInterval(iStartMillis, iEndMillis);
95 }
96 }
97
98
99
100
101
102
103
104
105
106 protected BaseInterval(ReadableInstant start, ReadableDuration duration) {
107 super();
108 iChronology = DateTimeUtils.getInstantChronology(start);
109 iStartMillis = DateTimeUtils.getInstantMillis(start);
110 long durationMillis = DateTimeUtils.getDurationMillis(duration);
111 iEndMillis = FieldUtils.safeAdd(iStartMillis, durationMillis);
112 checkInterval(iStartMillis, iEndMillis);
113 }
114
115
116
117
118
119
120
121
122
123 protected BaseInterval(ReadableDuration duration, ReadableInstant end) {
124 super();
125 iChronology = DateTimeUtils.getInstantChronology(end);
126 iEndMillis = DateTimeUtils.getInstantMillis(end);
127 long durationMillis = DateTimeUtils.getDurationMillis(duration);
128 iStartMillis = FieldUtils.safeAdd(iEndMillis, -durationMillis);
129 checkInterval(iStartMillis, iEndMillis);
130 }
131
132
133
134
135
136
137
138
139
140
141
142
143 protected BaseInterval(ReadableInstant start, ReadablePeriod period) {
144 super();
145 Chronology chrono = DateTimeUtils.getInstantChronology(start);
146 iChronology = chrono;
147 iStartMillis = DateTimeUtils.getInstantMillis(start);
148 if (period == null) {
149 iEndMillis = iStartMillis;
150 } else {
151 iEndMillis = chrono.add(period, iStartMillis, 1);
152 }
153 checkInterval(iStartMillis, iEndMillis);
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167 protected BaseInterval(ReadablePeriod period, ReadableInstant end) {
168 super();
169 Chronology chrono = DateTimeUtils.getInstantChronology(end);
170 iChronology = chrono;
171 iEndMillis = DateTimeUtils.getInstantMillis(end);
172 if (period == null) {
173 iStartMillis = iEndMillis;
174 } else {
175 iStartMillis = chrono.add(period, iEndMillis, -1);
176 }
177 checkInterval(iStartMillis, iEndMillis);
178 }
179
180
181
182
183
184
185
186
187
188 protected BaseInterval(Object interval, Chronology chrono) {
189 super();
190 IntervalConverter converter = ConverterManager.getInstance().getIntervalConverter(interval);
191 if (converter.isReadableInterval(interval, chrono)) {
192 ReadableInterval input = (ReadableInterval) interval;
193 iChronology = (chrono != null ? chrono : input.getChronology());
194 iStartMillis = input.getStartMillis();
195 iEndMillis = input.getEndMillis();
196 } else if (this instanceof ReadWritableInterval) {
197 converter.setInto((ReadWritableInterval) this, interval, chrono);
198 } else {
199 MutableInterval mi = new MutableInterval();
200 converter.setInto(mi, interval, chrono);
201 iChronology = mi.getChronology();
202 iStartMillis = mi.getStartMillis();
203 iEndMillis = mi.getEndMillis();
204 }
205 checkInterval(iStartMillis, iEndMillis);
206 }
207
208
209
210
211
212
213
214 public Chronology getChronology() {
215 return iChronology;
216 }
217
218
219
220
221
222
223
224 public long getStartMillis() {
225 return iStartMillis;
226 }
227
228
229
230
231
232
233
234 public long getEndMillis() {
235 return iEndMillis;
236 }
237
238
239
240
241
242
243
244
245
246
247 protected void setInterval(long startInstant, long endInstant, Chronology chrono) {
248 checkInterval(startInstant, endInstant);
249 iStartMillis = startInstant;
250 iEndMillis = endInstant;
251 iChronology = DateTimeUtils.getChronology(chrono);
252 }
253
254 }