Skip to content

Commit ca339b7

Browse files
committed
address pr feedback and create helper method
1 parent 3f5500f commit ca339b7

1 file changed

Lines changed: 34 additions & 29 deletions

File tree

‎java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtility.java‎

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)