@@ -148,6 +148,65 @@ public void testConvertTimeWithCalendar() {
148148 assertThat (resultCal .get (Calendar .SECOND )).isEqualTo (45 );
149149 }
150150
151+ @ Test
152+ public void testConvertTimeToCalendar () {
153+ Time time = Time .valueOf ("15:30:45" );
154+ Calendar cal = Calendar .getInstance ();
155+
156+ // Null checks
157+ assertThat (BigQueryTemporalUtility .convertTimeToCalendar (null , cal )).isNull ();
158+ assertThat (BigQueryTemporalUtility .convertTimeToCalendar (time , null )).isSameInstanceAs (time );
159+
160+ // Same timezone fast-path
161+ Calendar sameZoneCal = Calendar .getInstance (TimeZone .getDefault ());
162+ assertThat (BigQueryTemporalUtility .convertTimeToCalendar (time , sameZoneCal ))
163+ .isSameInstanceAs (time );
164+
165+ // Different timezone
166+ ZoneId tokyoZone = ZoneId .of ("Asia/Tokyo" );
167+ Calendar tokyoCal = Calendar .getInstance (TimeZone .getTimeZone (tokyoZone ));
168+ long tokyoTimeMillis =
169+ LocalTime .of (15 , 30 , 45 )
170+ .atDate (LocalDate .of (1970 , 1 , 1 ))
171+ .atZone (tokyoZone )
172+ .toInstant ()
173+ .toEpochMilli ();
174+ Time result =
175+ BigQueryTemporalUtility .convertTimeToCalendar (new Time (tokyoTimeMillis ), tokyoCal );
176+ long expectedSystemMillis =
177+ LocalTime .of (15 , 30 , 45 )
178+ .atDate (LocalDate .of (1970 , 1 , 1 ))
179+ .atZone (ZoneId .systemDefault ())
180+ .toInstant ()
181+ .toEpochMilli ();
182+ assertThat (result .getTime ()).isEqualTo (expectedSystemMillis );
183+ assertThat (result .toString ()).isEqualTo ("15:30:45" );
184+ }
185+
186+ @ Test
187+ public void testCrossTimezoneTimeRoundtrip () {
188+ ZoneId writeZone = ZoneId .of ("America/Los_Angeles" );
189+ ZoneId readZone = ZoneId .of ("Asia/Tokyo" );
190+ Calendar writeCal = Calendar .getInstance (TimeZone .getTimeZone (writeZone ));
191+ Calendar readCal = Calendar .getInstance (TimeZone .getTimeZone (readZone ));
192+
193+ Time inputTime =
194+ new Time (
195+ LocalTime .of (23 , 15 , 30 )
196+ .atDate (LocalDate .of (1970 , 1 , 1 ))
197+ .atZone (writeZone )
198+ .toInstant ()
199+ .toEpochMilli ());
200+ Time normalizedTime = BigQueryTemporalUtility .convertTimeToCalendar (inputTime , writeCal );
201+ Time readTime = BigQueryTemporalUtility .convertTimeWithCalendar (normalizedTime , readCal );
202+
203+ Calendar verifyCal = Calendar .getInstance (TimeZone .getTimeZone (readZone ));
204+ verifyCal .setTime (readTime );
205+ assertThat (verifyCal .get (Calendar .HOUR_OF_DAY )).isEqualTo (23 );
206+ assertThat (verifyCal .get (Calendar .MINUTE )).isEqualTo (15 );
207+ assertThat (verifyCal .get (Calendar .SECOND )).isEqualTo (30 );
208+ }
209+
151210 @ Test
152211 public void testBoxDateTimeAndDate () {
153212 Timestamp ts =
0 commit comments