|
@@ -2,16 +2,19 @@ |
2 |
2 |
|
|
3 |
3 |
|
import org.litesoft.core.typeutils.*; |
4 |
4 |
|
|
5 |
|
- |
public abstract class AbstractTimestampH<T extends AbstractTimestampH> extends AbstractCalendarYMD<T> implements TimestampAccessorH |
|
5 |
+ |
public abstract class AbstractTimestampH<T extends AbstractTimestampH, M extends AbstractTimestampH.Mutable> extends AbstractCalendarYMD<T, M> |
|
6 |
+ |
implements TimestampAccessorH |
6 |
7 |
|
{ |
7 |
8 |
|
private static final long serialVersionUID = 1L; |
8 |
9 |
|
|
9 |
|
- |
private final int mHour; |
|
10 |
+ |
private /* final */ int mHour; |
|
11 |
+ |
private /* final */ int mZuluOffsetMins; |
10 |
12 |
|
|
11 |
|
- |
protected AbstractTimestampH( int pYear, int pMonth, int pDay, int pHour ) |
|
13 |
+ |
protected AbstractTimestampH( int pYear, int pMonth, int pDay, int pZuluOffsetMins, int pHour ) |
12 |
14 |
|
{ |
13 |
15 |
|
super( pYear, pMonth, pDay ); |
14 |
16 |
|
mHour = validateHour( pHour ); |
|
17 |
+ |
mZuluOffsetMins = pZuluOffsetMins; |
15 |
18 |
|
} |
16 |
19 |
|
|
17 |
20 |
|
@Override |
|
@@ -20,8 +23,125 @@ |
20 |
23 |
|
return mHour; |
21 |
24 |
|
} |
22 |
25 |
|
|
|
26 |
+ |
/** |
|
27 |
+ |
* Return a T with the Hour set to the parameter. |
|
28 |
+ |
*/ |
|
29 |
+ |
public final T hour( int pHour ) |
|
30 |
+ |
{ |
|
31 |
+ |
validateHour( pHour ); |
|
32 |
+ |
return (mHour == pHour) ? us() : LLsetHour( pHour ); |
|
33 |
+ |
} |
|
34 |
+ |
|
|
35 |
+ |
/** |
|
36 |
+ |
* Return T with the parameter pHour added. |
|
37 |
+ |
*/ |
|
38 |
+ |
public final T addHours( int pHours ) |
|
39 |
+ |
{ |
|
40 |
+ |
return (pHours == 0) ? us() : LLsetHour( mHour + pHours ); |
|
41 |
+ |
} |
|
42 |
+ |
|
|
43 |
+ |
/** |
|
44 |
+ |
* Return T with the parameter pHour subtracted. |
|
45 |
+ |
*/ |
|
46 |
+ |
public final T minusHours( int pHours ) |
|
47 |
+ |
{ |
|
48 |
+ |
return (pHours == 0) ? us() : LLsetHour( mHour - pHours ); |
|
49 |
+ |
} |
|
50 |
+ |
|
|
51 |
+ |
public int getZuluOffsetMins() |
|
52 |
+ |
{ |
|
53 |
+ |
return mZuluOffsetMins; |
|
54 |
+ |
} |
|
55 |
+ |
|
23 |
56 |
|
// vvvvvvvvvvvvvvvvvv Support methods vvvvvvvvvvvvvvvvv |
24 |
57 |
|
|
|
58 |
+ |
protected static final int parseOffset( String pStringForm, String... pParts ) |
|
59 |
+ |
{ |
|
60 |
+ |
String zPart = Strings.noEmpty( pParts[pParts.length - 1] ); |
|
61 |
+ |
if ( zPart == null ) |
|
62 |
+ |
{ |
|
63 |
+ |
return 0; |
|
64 |
+ |
} |
|
65 |
+ |
char zPlusOrMinus = zPart.charAt( 0 ); |
|
66 |
+ |
if ( (zPlusOrMinus == '-') || (zPlusOrMinus == '+') ) |
|
67 |
+ |
{ |
|
68 |
+ |
zPart = zPart.substring( 1 ); |
|
69 |
+ |
int zOffset = 0; |
|
70 |
+ |
switch ( zPart.length() ) |
|
71 |
+ |
{ |
|
72 |
+ |
case 5: |
|
73 |
+ |
if ( zPart.charAt( 2 ) != ':' ) |
|
74 |
+ |
{ |
|
75 |
+ |
break; |
|
76 |
+ |
} |
|
77 |
+ |
zPart = zPart.substring( 0, 2 ) + zPart.substring( 3 ); |
|
78 |
+ |
// Fall Thru |
|
79 |
+ |
case 4: |
|
80 |
+ |
zOffset += parseInt( zPart.substring( 3 ), "Offset Minutes", pStringForm ); |
|
81 |
+ |
zPart = zPart.substring( 0, 2 ); |
|
82 |
+ |
// Fall Thru |
|
83 |
+ |
case 2: |
|
84 |
+ |
return zOffset + (60 * parseInt( zPart, "Offset Hours", pStringForm )); |
|
85 |
+ |
default: |
|
86 |
+ |
break; |
|
87 |
+ |
} |
|
88 |
+ |
} |
|
89 |
+ |
throw new IllegalArgumentException( "Invalid Offset in: " + pStringForm ); |
|
90 |
+ |
} |
|
91 |
+ |
|
|
92 |
+ |
protected static final StringBuilder tailSQLvalue( TimestampAccessorH pAccessorYMDH, boolean pAddTail, StringBuilder pSB ) |
|
93 |
+ |
{ |
|
94 |
+ |
if ( pAddTail ) |
|
95 |
+ |
{ |
|
96 |
+ |
pSB.append( 'Z' ); |
|
97 |
+ |
int zOffset = pAccessorYMDH.getZuluOffsetMins(); |
|
98 |
+ |
if ( zOffset != 0 ) |
|
99 |
+ |
{ |
|
100 |
+ |
if ( zOffset > 0 ) |
|
101 |
+ |
{ |
|
102 |
+ |
pSB.append( '+' ); |
|
103 |
+ |
} |
|
104 |
+ |
else |
|
105 |
+ |
{ |
|
106 |
+ |
pSB.append( '-' ); |
|
107 |
+ |
zOffset = -zOffset; |
|
108 |
+ |
} |
|
109 |
+ |
int zHours = zOffset / 60; |
|
110 |
+ |
int zMins = zOffset - (zHours * 60); |
|
111 |
+ |
pSB.append( Integers.zeroPadIt( 2, zHours ) ); |
|
112 |
+ |
if ( zMins != 0 ) |
|
113 |
+ |
{ |
|
114 |
+ |
pSB.append( ':' ).append( Integers.zeroPadIt( 2, zMins ) ); |
|
115 |
+ |
} |
|
116 |
+ |
} |
|
117 |
+ |
} |
|
118 |
+ |
return pSB; |
|
119 |
+ |
} |
|
120 |
+ |
|
|
121 |
+ |
protected static final int parseHour( String pStringForm, String... pParts ) |
|
122 |
+ |
{ |
|
123 |
+ |
return parseInt( pParts[3], "Hour", pStringForm ); |
|
124 |
+ |
} |
|
125 |
+ |
|
|
126 |
+ |
protected static final StringBuilder formatSQLvalueYMDH( TimestampAccessorH pAccessor, boolean pAddTail, StringBuilder pSB ) |
|
127 |
+ |
{ |
|
128 |
+ |
formatSQLvalueYMD( pAccessor, pSB ).append( 'T' ); |
|
129 |
+ |
formatHour( pAccessor, pSB ); |
|
130 |
+ |
return tailSQLvalue( pAccessor, pAddTail, pSB ); |
|
131 |
+ |
} |
|
132 |
+ |
|
|
133 |
+ |
protected static final StringBuilder formatSortableDisplayFormYMDH( TimestampAccessorH pAccessor, StringBuilder pSB ) |
|
134 |
+ |
{ |
|
135 |
+ |
formatSortableDisplayFormYMD( pAccessor, pSB ).append( ' ' ); |
|
136 |
+ |
return formatHour( pAccessor, pSB ); |
|
137 |
+ |
} |
|
138 |
+ |
|
|
139 |
+ |
protected static final StringBuilder formatHour( TimestampAccessorH pAccessor, StringBuilder pSB ) |
|
140 |
+ |
{ |
|
141 |
+ |
pSB.append( Integers.zeroPadIt( 2, pAccessor.getHour() ) ); |
|
142 |
+ |
return pSB; |
|
143 |
+ |
} |
|
144 |
+ |
|
25 |
145 |
|
protected static final int validateHour( int pHour ) |
26 |
146 |
|
throws IllegalArgumentException |
27 |
147 |
|
{ |
|
@@ -58,18 +178,48 @@ |
58 |
178 |
|
/** |
59 |
179 |
|
* @param pNewMonth != current |
60 |
180 |
|
*/ |
61 |
|
- |
abstract protected T LLsetMonth( int pNewMonth, boolean pAdjustForward ); |
|
181 |
+ |
protected final T LLsetHour( int pNewHour ) |
|
182 |
+ |
{ |
|
183 |
+ |
M zMutable = createMutable( getYear(), getMonth(), getDay(), pNewHour ); |
|
184 |
+ |
zMutable.normalize(); |
|
185 |
+ |
return createTypeFrom( zMutable ); |
|
186 |
+ |
} |
62 |
187 |
|
|
63 |
|
- |
protected static class Mutable extends AbstractCalendarYMD.Mutable |
|
188 |
+ |
protected abstract M createMutable( int pYear, int pMonth, int pDay, int pNewHour ); |
|
189 |
+ |
|
|
190 |
+ |
protected static class Mutable extends AbstractCalendarYMD.Mutable implements TimestampAccessorH |
64 |
191 |
|
{ |
|
192 |
+ |
private final int mZuluOffsetMins; |
65 |
193 |
|
protected int mHour; |
66 |
194 |
|
|
67 |
|
- |
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 ) |
68 |
196 |
|
{ |
69 |
197 |
|
super( pYear, pMonth, pDay, pDayConstrained ); |
|
198 |
+ |
mZuluOffsetMins = pZuluOffsetMins; |
70 |
199 |
|
mHour = pHour; |
71 |
200 |
|
} |
72 |
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 |
+ |
|
73 |
223 |
|
public final int getHour() |
74 |
224 |
|
{ |
75 |
225 |
|
return mHour; |
|
@@ -115,5 +265,14 @@ |
115 |
265 |
|
mHour -= 24; |
116 |
266 |
|
incrementDay(); |
117 |
267 |
|
} |
|
268 |
+ |
|
|
269 |
+ |
protected void adjustMinutesTo( int pOffsetMinsAdjustment ) |
|
270 |
+ |
{ |
|
271 |
+ |
if ( pOffsetMinsAdjustment != 0 ) |
|
272 |
+ |
{ |
|
273 |
+ |
mHour += pOffsetMinsAdjustment / 60; // Hours Offset |
|
274 |
+ |
normalize(); |
|
275 |
+ |
} |
|
276 |
+ |
} |
118 |
277 |
|
} |
119 |
278 |
|
} |