首页 > 解决方案 > 如何在 LocalTime 中设置必要的时区

问题描述

我有一个包含电影时间表的数据库。好吧,当然有两个这样的列:

CREATE TABLE tableName (
    hall_movies_schedules_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    hall_id  BIGINT UNSIGNED NOT NULL,
    film_id  BIGINT UNSIGNED NOT NULL,
    start_at TIME   NOT NULL,
    end_at   TIME   NOT NULL,
    date     DATE   NOT NULL,
    cost     INT    UNSIGNED NOT NULL,
    FOREIGN KEY(hall_id) REFERENCES cinema_halls(hall_id),
    FOREIGN KEY(film_id) REFERENCES films(film_id),
    PRIMARY KEY (hall_movies_schedules_id)
);  

我在java代码中有实体:

@Entity
@Table(name="tableName")
public class HallMoviesSchedule {

    ...
    @Column(nullable = false, name = "start_at")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    private LocalTime startAt;

    @Column(nullable = false, name = "end_at")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    private LocalTime endAt;
    ...

}

但是将信息拉到我的网页上比我所在地区的数据库中少一小时。如何解决这个问题?

标签: javatimezonelocaltime

解决方案


OffsetTime

还有一类OffsetTime。但是这门课对我和其他人来说毫无意义。我认为他的类包含在java.time中只是为了提供 SQL 标准中定义的这种类型的对应物。SQL 中的类型也没有任何意义。我只是为了完整起见才提到这些类型;我推荐他们使用。

LocalTime

TIME标准 SQL 和LocalTimeJava 中,该值通常表示一天中的时间,没有任何时区或偏移量的概念。因此,其存储不应涉及时区。如果您将中午十二点写入12:00:00.0数据库,您应该返回中午十二点。

myPreparedStatement.setObject( … , myLocalTime ) ;

和检索。

LocalTime myLocalTime = myResultSet.getObject( … , LocalTime.class ) ;

ZonedDateTime

如果您要出售某部电影在电影院放映的门票,则必须将该时间与日期和时区结合起来。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate tomorrow = LocalDate.now( z ).plusDays( 1 ) ;
ZonedDateTime zdtTicket = ZonedDateTime.of( tomorrow , myLocalTime , z ) ;

在 UTC 中看到同一时刻。

Instant instant = zdtTicket.toInstant() ;

推荐阅读