如何在 LocalTime 中设置必要的时区

How to set the necessary timezone in 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;
    ...

}

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

LocalTime 没有 TimeZone。您必须改用 ZonedDateTime

OffsetTime

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

LocalTime

对于标准 SQL 中的 TIME 和 Java 中的 LocalTime,该值一般表示一天中的时间,没有任何时区概念或抵消。所以它的存储不应该涉及时区。如果你把中午十二点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() ;