jdbc PostgreSQL中的偏移时间(带时区的时间)

时间:2018-10-15 07:55:39

标签: postgresql jdbc java-time

我正在尝试将java.time.OffsetTime保存并检索到PostgreSQL 10.5版(最新的JDBC驱动程序(v 42.2.5))中。

已保存偏移时间,但偏移时间无效(偏移应用服务器偏移而不是传递的偏移)。

根据https://jdbc.postgresql.org/documentation/head/8-date-time.html TIME WITH TIMEZONE尚不支持(至今?)。

  

请注意,ZonedDateTime,Instant和OffsetTime / TIME [无   不支持TIMEZONE]

我的问题是,我想将偏移时间保存到Postgres中,那么有什么替代方法?

注意,我只关心时间(实际上是一个时间表),但是我也需要知道偏移量,以便将原因与current_time进行比较。

我的例子:

public class Customer {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Column(columnDefinition = "time with time zone")
    private OffsetTime serviceTime;

    @Column(columnDefinition = "timestamp with time zone")
    private OffsetDateTime serviceDateTime;

    private Instant createdDate = Instant.now();
}

主要:

{
        OffsetTime serviceTime = OffsetTime.parse("10:00+02:00");
        OffsetDateTime serviceDateTime = OffsetDateTime.now().with(serviceTime);
        System.out.println(serviceTime);
        System.out.println(serviceDateTime);

        Customer customer = new Customer().withName("wael")
                .withServiceTime(serviceTime)
                .withServiceDateTime(serviceDateTime);
        System.out.println("customer: " +  customer);
        customerRepository.save(customer);
    }

    {
        Customer dbCustomer = customerRepository.findById(1L).get();

        OffsetTime dbServiceTime = dbCustomer.getServiceTime();
        OffsetDateTime dbServiceDateTime = dbCustomer.getServiceDateTime();

        System.out.println(dbServiceTime);
        System.out.println(dbServiceDateTime);
        System.out.println("from db customer: " +  dbCustomer);
    }

数据库:

id  created_date    name    service_date_time   service_time
1   2018-10-15 10:38:27.814000  wael    2018-10-15 08:00:00.000000  10:00:00 +03:00

输出:

10:00+02:00
2018-10-15T10:00+02:00
customer: Customer(id=null, name=wael, serviceTime=10:00+02:00, serviceDateTime=2018-10-15T10:00+02:00, createdDate=2018-10-15T07:10:59.900Z)
10:00+03:00
2018-10-15T11:00+03:00
from db customer: Customer(id=1, name=wael, serviceTime=10:00+03:00, serviceDateTime=2018-10-15T11:00+03:00, createdDate=2018-10-15T07:10:59.900Z)

请注意,我的机器时区为+3(因此db中的打印信息为+3),而我的数据库服务器是具有UTC日期时间设置的docker映像。

观察:

OffsetDatetime已正确保存(作为UTC)并正确检索。
OffsetTime 保存的时间不正确(应为10:00:00 +02:0011:00:00 +03:00甚至08:00:00 +00:00而非10:00:00 +03:00,然后检索不正确!)

1 个答案:

答案 0 :(得分:0)

使用JPA 2.2,您还可以在Postgresql中使用OffsetTime。

@Column(name = "offset_time", columnDefinition = "TIME WITH TIME ZONE")
private OffsetTime offsetTime;

这就是它存储在我的数据库中的方式:22:00:00.000000 +02:00