@@ -96,16 +96,12 @@ public static Time boxTime(String val, ZoneId zoneId) {
9696 // Legacy JDBC 3.0 API (Calendar provided):
9797 // Use legacy Calendar manipulation to intentionally replicate old JVM historical DST quirks
9898 // for January 1, 1970, ensuring strict backwards compatibility for legacy ORMs.
99- Calendar targetCal = Calendar .getInstance (TimeZone .getTimeZone (zoneId ));
100- targetCal .set (Calendar .YEAR , 1970 );
101- targetCal .set (Calendar .MONTH , Calendar .JANUARY );
102- targetCal .set (Calendar .DAY_OF_MONTH , 1 );
103- targetCal .set (Calendar .HOUR_OF_DAY , localTime .getHour ());
104- targetCal .set (Calendar .MINUTE , localTime .getMinute ());
105- targetCal .set (Calendar .SECOND , localTime .getSecond ());
106- targetCal .set (Calendar .MILLISECOND , localTime .getNano () / 1_000_000 );
107-
108- return new Time (targetCal .getTimeInMillis ());
99+ return createTimeInCalendar (
100+ Calendar .getInstance (TimeZone .getTimeZone (zoneId )),
101+ localTime .getHour (),
102+ localTime .getMinute (),
103+ localTime .getSecond (),
104+ localTime .getNano () / 1_000_000 );
109105 }
110106
111107 /**
@@ -460,23 +456,12 @@ static Time convertTimeWithCalendar(Time time, Calendar cal) {
460456 if (time == null || cal == null ) {
461457 return time ;
462458 }
463- ZoneId systemZone = ZoneId . systemDefault ();
464- ZoneId targetZone = cal .getTimeZone (). toZoneId ();
459+ TimeZone systemZone = TimeZone . getDefault ();
460+ TimeZone targetZone = cal .getTimeZone ();
465461 if (systemZone .equals (targetZone )) {
466462 return time ;
467463 }
468- Calendar defaultCal = Calendar .getInstance ();
469- defaultCal .setTime (time );
470-
471- Calendar targetCal = getSafeCalendar (cal );
472- targetCal .set (Calendar .YEAR , 1970 );
473- targetCal .set (Calendar .MONTH , Calendar .JANUARY );
474- targetCal .set (Calendar .DAY_OF_MONTH , 1 );
475- targetCal .set (Calendar .HOUR_OF_DAY , defaultCal .get (Calendar .HOUR_OF_DAY ));
476- targetCal .set (Calendar .MINUTE , defaultCal .get (Calendar .MINUTE ));
477- targetCal .set (Calendar .SECOND , defaultCal .get (Calendar .SECOND ));
478- targetCal .set (Calendar .MILLISECOND , defaultCal .get (Calendar .MILLISECOND ));
479- return new Time (targetCal .getTimeInMillis ());
464+ return shiftTimeBetweenCalendars (time , Calendar .getInstance (), getSafeCalendar (cal ));
480465 }
481466
482467 /**
@@ -493,13 +478,33 @@ static Time convertTimeToCalendar(Time time, Calendar cal) {
493478 if (time == null || cal == null ) {
494479 return time ;
495480 }
496- ZoneId systemZone = ZoneId . systemDefault ();
497- ZoneId targetZone = cal .getTimeZone (). toZoneId ();
481+ TimeZone systemZone = TimeZone . getDefault ();
482+ TimeZone targetZone = cal .getTimeZone ();
498483 if (systemZone .equals (targetZone )) {
499484 return time ;
500485 }
501- LocalTime localTime = Instant .ofEpochMilli (time .getTime ()).atZone (targetZone ).toLocalTime ();
502- ZonedDateTime zdt = localTime .atDate (LocalDate .of (1970 , 1 , 1 )).atZone (systemZone );
503- return new Time (zdt .toInstant ().toEpochMilli ());
486+ return shiftTimeBetweenCalendars (time , getSafeCalendar (cal ), Calendar .getInstance ());
487+ }
488+
489+ private static Time shiftTimeBetweenCalendars (Time time , Calendar sourceCal , Calendar destCal ) {
490+ sourceCal .setTime (time );
491+ return createTimeInCalendar (
492+ destCal ,
493+ sourceCal .get (Calendar .HOUR_OF_DAY ),
494+ sourceCal .get (Calendar .MINUTE ),
495+ sourceCal .get (Calendar .SECOND ),
496+ sourceCal .get (Calendar .MILLISECOND ));
497+ }
498+
499+ private static Time createTimeInCalendar (
500+ Calendar destCal , int hour , int minute , int second , int millisecond ) {
501+ destCal .set (Calendar .YEAR , 1970 );
502+ destCal .set (Calendar .MONTH , Calendar .JANUARY );
503+ destCal .set (Calendar .DAY_OF_MONTH , 1 );
504+ destCal .set (Calendar .HOUR_OF_DAY , hour );
505+ destCal .set (Calendar .MINUTE , minute );
506+ destCal .set (Calendar .SECOND , second );
507+ destCal .set (Calendar .MILLISECOND , millisecond );
508+ return new Time (destCal .getTimeInMillis ());
504509 }
505510}
0 commit comments