如何在 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() ;
我有一个包含电影时间表的数据库。嗯,当然有两个这样的栏目:
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() ;