|
@@ -2,72 +2,25 @@ |
2 |
2 |
|
|
3 |
3 |
|
import org.litesoft.core.typeutils.*; |
4 |
4 |
|
|
5 |
|
- |
public abstract class AbstractTimestampH<T extends AbstractTimestampH, M extends AbstractTimestampH.Mutable> |
6 |
|
- |
extends AbstractCalendarYMD<T, M> |
|
5 |
+ |
public abstract class AbstractTimestampH<T extends AbstractTimestampH, M extends AbstractTimestampH.Mutable> extends AbstractCalendarYMD<T, M> |
7 |
6 |
|
implements TimestampAccessorH |
8 |
7 |
|
{ |
9 |
8 |
|
private static final long serialVersionUID = 1L; |
10 |
9 |
|
|
11 |
|
- |
private long mUTC; |
12 |
|
- |
private int mOriginalZuluOffsetMins; |
13 |
|
- |
private transient UtilDateAdaptor mWall; |
|
10 |
+ |
private /* final */ int mHour; |
|
11 |
+ |
private /* final */ int mZuluOffsetMins; |
14 |
12 |
|
|
15 |
|
- |
protected AbstractTimestampH( int pOriginalZuluOffsetMins, long pUTC ) |
|
13 |
+ |
protected AbstractTimestampH( int pYear, int pMonth, int pDay, int pZuluOffsetMins, int pHour ) |
16 |
14 |
|
{ |
17 |
|
- |
mOriginalZuluOffsetMins = pOriginalZuluOffsetMins; |
18 |
|
- |
mUTC = pUTC; |
19 |
|
- |
} |
20 |
|
- |
|
21 |
|
- |
protected AbstractTimestampH( int pOriginalZuluOffsetMins, UtilDateAdaptor pDateAdaptor ) |
22 |
|
- |
{ |
23 |
|
- |
this( pOriginalZuluOffsetMins, pDateAdaptor.getUTClong() ); |
24 |
|
- |
mWall = Cast.it( pDateAdaptor ); |
25 |
|
- |
} |
26 |
|
- |
|
27 |
|
- |
protected AbstractTimestampH( UtilDateAdaptor pDateAdaptor ) |
28 |
|
- |
{ |
29 |
|
- |
this( pDateAdaptor.getZuluOffsetMins(), pDateAdaptor ); |
30 |
|
- |
} |
31 |
|
- |
|
32 |
|
- |
public long getUTClong() |
33 |
|
- |
{ |
34 |
|
- |
return mUTC; |
35 |
|
- |
} |
36 |
|
- |
|
37 |
|
- |
public int getOriginalZuluOffsetMins() |
38 |
|
- |
{ |
39 |
|
- |
return mOriginalZuluOffsetMins; |
40 |
|
- |
} |
41 |
|
- |
|
42 |
|
- |
protected final synchronized UtilDateAdaptor getWall() |
43 |
|
- |
{ |
44 |
|
- |
return (mWall != null) ? mWall : (mWall = createWall()); |
45 |
|
- |
} |
46 |
|
- |
|
47 |
|
- |
protected abstract UtilDateAdaptor createWall(); |
48 |
|
- |
|
49 |
|
- |
@Override |
50 |
|
- |
public final int getYear() |
51 |
|
- |
{ |
52 |
|
- |
return getWall().getYear(); |
53 |
|
- |
} |
54 |
|
- |
|
55 |
|
- |
@Override |
56 |
|
- |
public final int getMonth() |
57 |
|
- |
{ |
58 |
|
- |
return getWall().getMonth(); |
59 |
|
- |
} |
60 |
|
- |
|
61 |
|
- |
@Override |
62 |
|
- |
public final int getDay() |
63 |
|
- |
{ |
64 |
|
- |
return getWall().getDay(); |
|
15 |
+ |
super( pYear, pMonth, pDay ); |
|
16 |
+ |
mHour = validateHour( pHour ); |
|
17 |
+ |
mZuluOffsetMins = pZuluOffsetMins; |
65 |
18 |
|
} |
66 |
19 |
|
|
67 |
20 |
|
@Override |
68 |
21 |
|
public final int getHour() |
69 |
22 |
|
{ |
70 |
|
- |
return getWall().getHour(); |
|
23 |
+ |
return mHour; |
71 |
24 |
|
} |
72 |
25 |
|
|
73 |
26 |
|
/** |
|
@@ -76,7 +29,7 @@ |
76 |
29 |
|
public final T hour( int pHour ) |
77 |
30 |
|
{ |
78 |
31 |
|
validateHour( pHour ); |
79 |
|
- |
return (getHour() == pHour) ? us() : LLsetHour( pHour ); |
|
32 |
+ |
return (mHour == pHour) ? us() : LLsetHour( pHour ); |
80 |
33 |
|
} |
81 |
34 |
|
|
82 |
35 |
|
/** |
|
@@ -84,7 +37,7 @@ |
84 |
37 |
|
*/ |
85 |
38 |
|
public final T addHours( int pHours ) |
86 |
39 |
|
{ |
87 |
|
- |
return (pHours == 0) ? us() : LLsetHour( getHour() + pHours ); |
|
40 |
+ |
return (pHours == 0) ? us() : LLsetHour( mHour + pHours ); |
88 |
41 |
|
} |
89 |
42 |
|
|
90 |
43 |
|
/** |
|
@@ -92,12 +45,12 @@ |
92 |
45 |
|
*/ |
93 |
46 |
|
public final T minusHours( int pHours ) |
94 |
47 |
|
{ |
95 |
|
- |
return (pHours == 0) ? us() : LLsetHour( getHour() - pHours ); |
|
48 |
+ |
return (pHours == 0) ? us() : LLsetHour( mHour - pHours ); |
96 |
49 |
|
} |
97 |
50 |
|
|
98 |
51 |
|
public int getZuluOffsetMins() |
99 |
52 |
|
{ |
100 |
|
- |
return getWall().getZuluOffsetMins(); |
|
53 |
+ |
return mZuluOffsetMins; |
101 |
54 |
|
} |
102 |
55 |
|
|
103 |
56 |
|
// vvvvvvvvvvvvvvvvvv Support methods vvvvvvvvvvvvvvvvv |
|
@@ -113,26 +66,22 @@ |
113 |
66 |
|
if ( (zPlusOrMinus == '-') || (zPlusOrMinus == '+') ) |
114 |
67 |
|
{ |
115 |
68 |
|
zPart = zPart.substring( 1 ); |
|
69 |
+ |
int zOffset = 0; |
116 |
70 |
|
switch ( zPart.length() ) |
117 |
71 |
|
{ |
118 |
72 |
|
case 5: |
119 |
|
- |
if ( zPart.charAt( 2 ) == ':' ) |
|
73 |
+ |
if ( zPart.charAt( 2 ) != ':' ) |
120 |
74 |
|
{ |
121 |
|
- |
return parseOffset( zPlusOrMinus, zPart, 2, 3, pStringForm ); |
|
75 |
+ |
break; |
122 |
76 |
|
} |
123 |
|
- |
break; |
|
77 |
+ |
zPart = zPart.substring( 0, 2 ) + zPart.substring( 3 ); |
|
78 |
+ |
// Fall Thru |
124 |
79 |
|
case 4: |
125 |
|
- |
if ( zPart.charAt( 1 ) == ':' ) |
126 |
|
- |
{ |
127 |
|
- |
return parseOffset( zPlusOrMinus, zPart, 1, 2, pStringForm ); |
128 |
|
- |
} |
129 |
|
- |
return parseOffset( zPlusOrMinus, zPart, 2, 2, pStringForm ); |
130 |
|
- |
case 3: |
131 |
|
- |
return parseOffset( zPlusOrMinus, zPart, 1, 1, pStringForm ); |
|
80 |
+ |
zOffset += parseInt( zPart.substring( 3 ), "Offset Minutes", pStringForm ); |
|
81 |
+ |
zPart = zPart.substring( 0, 2 ); |
|
82 |
+ |
// Fall Thru |
132 |
83 |
|
case 2: |
133 |
|
- |
return directionalizeOffset( zPlusOrMinus, parseOffsetHours( zPart, 2, pStringForm ), 0 ); |
134 |
|
- |
case 1: |
135 |
|
- |
return directionalizeOffset( zPlusOrMinus, parseOffsetHours( zPart, 1, pStringForm ), 0 ); |
|
84 |
+ |
return zOffset + (60 * parseInt( zPart, "Offset Hours", pStringForm )); |
136 |
85 |
|
default: |
137 |
86 |
|
break; |
138 |
87 |
|
} |
|
@@ -140,32 +89,6 @@ |
140 |
89 |
|
throw new IllegalArgumentException( "Invalid Offset in: " + pStringForm ); |
141 |
90 |
|
} |
142 |
91 |
|
|
143 |
|
- |
private static int parseOffset( char pPlusOrMinus, String pPart, int pHourUpTo, int pMinFrom, String pStringForm ) |
144 |
|
- |
{ |
145 |
|
- |
return parseOffset( pPlusOrMinus, parseOffsetHours( pPart, pHourUpTo, pStringForm ), pPart, pMinFrom, pStringForm ); |
146 |
|
- |
} |
147 |
|
- |
|
148 |
|
- |
private static int parseOffset( char pPlusOrMinus, int pHours, String pPart, int pMinFrom, String pStringForm ) |
149 |
|
- |
{ |
150 |
|
- |
return directionalizeOffset( pPlusOrMinus, pHours, parseOffsetMinutes( pPart, pMinFrom, pStringForm ) ); |
151 |
|
- |
} |
152 |
|
- |
|
153 |
|
- |
private static int directionalizeOffset( char pPlusOrMinus, int pHours, int pMinutes ) |
154 |
|
- |
{ |
155 |
|
- |
int zPositiveOffset = (60 * pHours) + pMinutes; |
156 |
|
- |
return (pPlusOrMinus == '+') ? zPositiveOffset : -1 * zPositiveOffset; |
157 |
|
- |
} |
158 |
|
- |
|
159 |
|
- |
private static int parseOffsetHours( String pPart, int pUpTo, String pStringForm ) |
160 |
|
- |
{ |
161 |
|
- |
return parseInt( pPart.substring( 0, pUpTo ), "Offset Hours", pStringForm ); |
162 |
|
- |
} |
163 |
|
- |
|
164 |
|
- |
private static int parseOffsetMinutes( String pPart, int pFrom, String pStringForm ) |
165 |
|
- |
{ |
166 |
|
- |
return parseInt( pPart.substring( pFrom ), "Offset Minutes", pStringForm ); |
167 |
|
- |
} |
168 |
|
- |
|
169 |
92 |
|
protected static final StringBuilder tailSQLvalue( TimestampAccessorH pAccessorYMDH, boolean pAddTail, StringBuilder pSB ) |
170 |
93 |
|
{ |
171 |
94 |
|
if ( pAddTail ) |
|
@@ -231,7 +154,7 @@ |
231 |
154 |
|
|
232 |
155 |
|
protected int LL_hashCode() |
233 |
156 |
|
{ |
234 |
|
- |
return hashCodeEm( super.hashCode(), getHour() ); |
|
157 |
+ |
return hashCodeEm( super.hashCode(), mHour ); |
235 |
158 |
|
} |
236 |
159 |
|
|
237 |
160 |
|
/** |
|
@@ -253,7 +176,7 @@ |
253 |
176 |
|
} |
254 |
177 |
|
|
255 |
178 |
|
/** |
256 |
|
- |
* @param pNewHour != current |
|
179 |
+ |
* @param pNewMonth != current |
257 |
180 |
|
*/ |
258 |
181 |
|
protected final T LLsetHour( int pNewHour ) |
259 |
182 |
|
{ |
|
@@ -264,16 +187,39 @@ |
264 |
187 |
|
|
265 |
188 |
|
protected abstract M createMutable( int pYear, int pMonth, int pDay, int pNewHour ); |
266 |
189 |
|
|
267 |
|
- |
protected static class Mutable extends AbstractCalendarYMD.Mutable |
|
190 |
+ |
protected static class Mutable extends AbstractCalendarYMD.Mutable implements TimestampAccessorH |
268 |
191 |
|
{ |
|
192 |
+ |
private final int mZuluOffsetMins; |
269 |
193 |
|
protected int mHour; |
270 |
194 |
|
|
271 |
|
- |
public Mutable( int pYear, int pMonth, int pDay, boolean pDayConstrained, int pHour ) |
|
195 |
+ |
public Mutable( int pYear, int pMonth, int pDay, boolean pDayConstrained, int pZuluOffsetMins, int pHour ) |
272 |
196 |
|
{ |
273 |
197 |
|
super( pYear, pMonth, pDay, pDayConstrained ); |
|
198 |
+ |
mZuluOffsetMins = pZuluOffsetMins; |
274 |
199 |
|
mHour = pHour; |
275 |
200 |
|
} |
276 |
201 |
|
|
|
202 |
+ |
@Override |
|
203 |
+ |
public int getZuluOffsetMins() |
|
204 |
+ |
{ |
|
205 |
+ |
return mZuluOffsetMins; |
|
206 |
+ |
} |
|
207 |
+ |
|
|
208 |
+ |
public void fromWallToZulu() |
|
209 |
+ |
{ |
|
210 |
+ |
adjustMinutesTo( -UtilDateAdaptor.calculateCurrentUTCtoWallOffsetMinutes() ); |
|
211 |
+ |
} |
|
212 |
+ |
|
|
213 |
+ |
public void fromZuluToWall() |
|
214 |
+ |
{ |
|
215 |
+ |
adjustMinutesTo( UtilDateAdaptor.calculateCurrentUTCtoWallOffsetMinutes() ); |
|
216 |
+ |
} |
|
217 |
+ |
|
|
218 |
+ |
public void fromOriginalWallToWall() |
|
219 |
+ |
{ |
|
220 |
+ |
adjustMinutesTo( UtilDateAdaptor.calculateCurrentUTCtoWallOffsetMinutes() - getZuluOffsetMins() ); |
|
221 |
+ |
} |
|
222 |
+ |
|
277 |
223 |
|
public final int getHour() |
278 |
224 |
|
{ |
279 |
225 |
|
return mHour; |
|
@@ -320,11 +266,11 @@ |
320 |
266 |
|
incrementDay(); |
321 |
267 |
|
} |
322 |
268 |
|
|
323 |
|
- |
public void adjustOrigWallToZulu( int pOffsetMinsAdjustment ) |
|
269 |
+ |
protected void adjustMinutesTo( int pOffsetMinsAdjustment ) |
324 |
270 |
|
{ |
325 |
271 |
|
if ( pOffsetMinsAdjustment != 0 ) |
326 |
272 |
|
{ |
327 |
|
- |
mHour -= pOffsetMinsAdjustment / 60; // Hours Offset |
|
273 |
+ |
mHour += pOffsetMinsAdjustment / 60; // Hours Offset |
328 |
274 |
|
normalize(); |
329 |
275 |
|
} |
330 |
276 |
|
} |