首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jooq转换器:从java.sql.Date到java.time.LocalDate

jooq转换器:从java.sql.Date到java.time.LocalDate
EN

Stack Overflow用户
提问于 2014-08-21 17:35:51
回答 1查看 4.7K关注 0票数 6

我尝试过编写一个Converter<java.sql.Date, java.time.LocalDate>,但是我无法让它与所有时区设置一起工作。

这个想法是:

  • 如果客户端代码有一个LocalDate (比如20-8月-2014年8月-2014年),并将其保存到DB中,那么无论客户机时区是什么,它都应该显示为20-8月-2014年在DB中。
  • 如果DB包含的日期为20-8月-2014年,则无论客户端时区是什么,客户端都应该收到一个20-8月-2014年的LocalDate。

我的测试:

代码语言:javascript
复制
@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();
  }
}

我的转换器:

代码语言:javascript
复制
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; }
}

我试过不同的变体,但都没有用.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-21 18:55:55

问题实际上是在测试中!JDBC驱动程序在创建时区时缓存它,并且没有考虑测试循环中的时区更新。每次测试中的时区更改使其通过时,都会使用一个新连接。

因此,问题中的代码适用于日期到LocalDate转换器(除了它应该接受null)。定稿:

代码语言:javascript
复制
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转换器的时间可以以类似的方式完成:

代码语言:javascript
复制
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; }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25432514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档