1
1
/*
2
2
* -----------------------------------------------------------------------
3
- * Copyright © 2013-2016 Meno Hochschild, <http://www.menodata.de/>
3
+ * Copyright © 2013-2017 Meno Hochschild, <http://www.menodata.de/>
4
4
* -----------------------------------------------------------------------
5
5
* This file (TemporalType.java) is part of project Time4J.
6
6
*
25
25
import net .time4j .engine .ChronoException ;
26
26
import net .time4j .engine .Converter ;
27
27
import net .time4j .scale .TimeScale ;
28
+ import net .time4j .tz .Timezone ;
29
+
30
+ import java .util .Calendar ;
31
+ import java .util .Date ;
32
+ import java .util .GregorianCalendar ;
33
+ import java .util .TimeZone ;
28
34
29
35
30
36
/**
@@ -92,7 +98,7 @@ public abstract class TemporalType<S, T>
92
98
*
93
99
* @since 2.0
94
100
*/
95
- public static final TemporalType <java . util . Date , Moment > JAVA_UTIL_DATE =
101
+ public static final TemporalType <Date , Moment > JAVA_UTIL_DATE =
96
102
new JavaUtilDateRule ();
97
103
98
104
/**
@@ -133,6 +139,48 @@ public abstract class TemporalType<S, T>
133
139
public static final TemporalType <Long , Moment > MILLIS_SINCE_UNIX =
134
140
new MillisSinceUnixRule ();
135
141
142
+ /**
143
+ * <p>Bridge between a traditional Java calendar of type
144
+ * {@code java.util.Calendar} and the class {@code ZonalDateTime}.</p>
145
+ *
146
+ * <p>The conversion tries to keep the instant and zone data involved. A change
147
+ * of the local timestamp part of {@code Calendar} is possible, however. This
148
+ * concerns the conversion of any non-gregorian calendar. </p>
149
+ *
150
+ * @since 3.37/4.32
151
+ */
152
+ /*[deutsch]
153
+ * <p>Brücke zwischen einem traditionellen Java-Kalender des Typs
154
+ * {@code java.util.Calendar} und der Klasse {@code ZonalDateTime}. </p>
155
+ *
156
+ * <p>Die Konversion versucht, den Moment und die verwendeten Zeitzonendaten zu erhalten.
157
+ * Eine Änderung des lokalen Zeitstempels ist aber möglich. Das betrifft die
158
+ * Umwandlung eines jeden nicht-gregorianischen Kalenders. </p>
159
+ *
160
+ * @since 3.37/4.32
161
+ */
162
+ public static final TemporalType <Calendar , ZonalDateTime > JAVA_UTIL_CALENDAR = new CalendarRule ();
163
+
164
+ /**
165
+ * <p>Bridge between a traditional Java timezone of type
166
+ * {@code java.util.TimeZone} and the class {@code net.time4j.tz.Timezone}.</p>
167
+ *
168
+ * <p>The conversion tries to keep the data and rules of the zone to be converted. </p>
169
+ *
170
+ * @since 3.37/4.32
171
+ */
172
+ /*[deutsch]
173
+ * <p>Brücke zwischen einer traditionellen Java-Zeitzone des Typs
174
+ * {@code java.util.TimeZone} und der Klasse {@code net.time4j.tz.Timezone}. </p>
175
+ *
176
+ * <p>Die Konversion versucht, die zugrundeliegenden Daten und Regeln des Ausgangsobjekts zu erhalten. </p>
177
+ *
178
+ * @since 3.37/4.32
179
+ */
180
+ public static final TemporalType <TimeZone , Timezone > JAVA_UTIL_TIMEZONE = new ZoneRule ();
181
+
182
+ private static final String JUT_PROVIDER = "java.util.TimeZone~" ;
183
+
136
184
//~ Konstruktoren -----------------------------------------------------
137
185
138
186
/**
@@ -198,12 +246,12 @@ protected TemporalType() {
198
246
//~ Innere Klassen ----------------------------------------------------
199
247
200
248
private static class JavaUtilDateRule
201
- extends TemporalType <java . util . Date , Moment > {
249
+ extends TemporalType <Date , Moment > {
202
250
203
251
//~ Methoden ------------------------------------------------------
204
252
205
253
@ Override
206
- public Moment translate (java . util . Date source ) {
254
+ public Moment translate (Date source ) {
207
255
208
256
long millis = source .getTime ();
209
257
long seconds = MathUtils .floorDivide (millis , 1000 );
@@ -213,7 +261,7 @@ public Moment translate(java.util.Date source) {
213
261
}
214
262
215
263
@ Override
216
- public java . util . Date from (Moment target ) {
264
+ public Date from (Moment target ) {
217
265
218
266
long posixTime = target .getPosixTime ();
219
267
int fraction = target .getNanosecond ();
@@ -222,14 +270,14 @@ public java.util.Date from(Moment target) {
222
270
MathUtils .safeAdd (
223
271
MathUtils .safeMultiply (posixTime , 1000 ),
224
272
fraction / MIO );
225
- return new java . util . Date (millis );
273
+ return new Date (millis );
226
274
227
275
}
228
276
229
277
@ Override
230
- public Class <java . util . Date > getSourceType () {
278
+ public Class <Date > getSourceType () {
231
279
232
- return java . util . Date .class ;
280
+ return Date .class ;
233
281
234
282
}
235
283
@@ -272,4 +320,82 @@ public Class<Long> getSourceType() {
272
320
273
321
}
274
322
323
+ private static class CalendarRule
324
+ extends TemporalType <Calendar , ZonalDateTime > {
325
+
326
+ //~ Methoden ------------------------------------------------------
327
+
328
+ @ Override
329
+ public ZonalDateTime translate (Calendar source ) {
330
+
331
+ Moment m = TemporalType .JAVA_UTIL_DATE .translate (source .getTime ());
332
+ Timezone tz = TemporalType .JAVA_UTIL_TIMEZONE .translate (source .getTimeZone ());
333
+ return ZonalDateTime .of (m , tz );
334
+
335
+ }
336
+
337
+ @ Override
338
+ public Calendar from (ZonalDateTime time4j ) {
339
+
340
+ Date jud = TemporalType .JAVA_UTIL_DATE .from (time4j .toMoment ());
341
+ TimeZone tz = TemporalType .JAVA_UTIL_TIMEZONE .from (time4j .getTimezone0 ());
342
+ GregorianCalendar gcal = new GregorianCalendar ();
343
+ gcal .setGregorianChange (new Date (Long .MIN_VALUE )); // proleptic gregorian
344
+ gcal .setFirstDayOfWeek (Calendar .MONDAY ); // keeping ISO-8601-semantic
345
+ gcal .setMinimalDaysInFirstWeek (4 ); // keeping ISO-8601-semantic
346
+ gcal .setTimeZone (tz );
347
+ gcal .setTime (jud );
348
+ return gcal ;
349
+
350
+ }
351
+
352
+ @ Override
353
+ public Class <Calendar > getSourceType () {
354
+
355
+ return Calendar .class ;
356
+
357
+ }
358
+
359
+ }
360
+
361
+ private static class ZoneRule
362
+ extends TemporalType <TimeZone , Timezone > {
363
+
364
+ //~ Methoden ------------------------------------------------------
365
+
366
+ @ Override
367
+ public Timezone translate (TimeZone source ) {
368
+
369
+ if (source instanceof OldApiTimezone ) {
370
+ return ((OldApiTimezone ) source ).getDelegate ();
371
+ } else {
372
+ return Timezone .of (JUT_PROVIDER + source .getID ());
373
+ }
374
+
375
+ }
376
+
377
+ @ Override
378
+ public TimeZone from (Timezone time4j ) {
379
+
380
+ if (time4j .getHistory () == null ) {
381
+ String id = time4j .getID ().canonical ();
382
+ if (id .startsWith (JUT_PROVIDER )) {
383
+ id = id .substring (JUT_PROVIDER .length ());
384
+ }
385
+ return TimeZone .getTimeZone (id );
386
+ } else {
387
+ return new OldApiTimezone (time4j );
388
+ }
389
+
390
+ }
391
+
392
+ @ Override
393
+ public Class <TimeZone > getSourceType () {
394
+
395
+ return TimeZone .class ;
396
+
397
+ }
398
+
399
+ }
400
+
275
401
}
0 commit comments