Subversion Repository Public Repository

litesoft

Diff Revisions 862 vs 864 for /trunk/Java/core/Anywhere/src/org/litesoft/core/simpletypes/temporal/AbstractTimestampH.java

Diff revisions: vs.
  @@ -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 }