我曾尝试编写Converter<java.sql.Date, java.time.LocalDate>
,但我无法使用所有时区设置。
这个想法:
LocalDate
,比如2014年8月20日,并将其保存到数据库,那么无论客户端的时区是什么,它都应该在2014年8月20日出现在数据库中我的测试:
@Test public void dateConverter() {
for (int offset = -12; offset <= 12; offset++) {
TimeZone localTz = TimeZone.getTimeZone(ZoneOffset.ofHours(offset));
TimeZone.setDefault(localTz);
LocalDate ld = LocalDate.now();
sql.insertInto(DATE_TEST).set(new DateTestRecord(ld)).execute();
LocalDate savedLd = sql.selectFrom(DATE_TEST).fetchOne(DATE_TEST.DATE_);
assertEquals(savedLd, ld, "offset=" + offset);
sql.delete(DATE_TEST).execute();
}
}
我的转换器:
public class DateConverter implements Converter<Date, LocalDate>{
@Override public LocalDate from(Date date) { return date.toLocalDate(); }
@Override public Date to(LocalDate ld) { return Date.valueOf(ld); }
@Override public Class<Date> fromType() { return Date.class; }
@Override public Class<LocalDate> toType() { return LocalDate.class; }
}
我尝试了各种各样的变化但没有效果......
答案 0 :(得分:2)
问题实际上在测试中! JDBC驱动程序在创建时区域时会缓存时区,并且不会考虑测试循环中的时区更新。每次测试中的时间区域发生变化时都采用新的连接使其通过。
因此,问题中的代码适用于Date to LocalDate转换器(除了它应该接受null)。最终版本:
public class DateConverter implements Converter<Date, LocalDate> {
@Override public LocalDate from(Date date) { return date == null ? null : date.toLocalDate(); }
@Override public Date to(LocalDate ld) { return ld == null ? null : Date.valueOf(ld); }
@Override public Class<Date> fromType() { return Date.class; }
@Override public Class<LocalDate> toType() { return LocalDate.class; }
}
OffsetTime转换器的时区时间可以类似的方式完成:
public class TimeConverter implements Converter<Time, OffsetTime> {
@Override public OffsetTime from(Time time) {
return time == null ? null : OffsetTime.ofInstant(Instant.ofEpochMilli(time.getTime()), ZoneOffset.systemDefault());
}
@Override public Time to(OffsetTime offsetTime) {
return offsetTime == null ? null : new Time(offsetTime.atDate(LocalDate.ofEpochDay(0)).toInstant().toEpochMilli());
}
@Override public Class<Time> fromType() { return Time.class; }
@Override public Class<OffsetTime> toType() { return OffsetTime.class; }
}