java - 如何在 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;
...
}
但是将信息拉到我的网页上比我所在地区的数据库中少一小时。如何解决这个问题?
解决方案
OffsetTime
还有一类OffsetTime
。但是这门课对我和其他人来说毫无意义。我认为他的类包含在java.time中只是为了提供 SQL 标准中定义的这种类型的对应物。SQL 中的类型也没有任何意义。我只是为了完整起见才提到这些类型;我不推荐他们使用。
LocalTime
在TIME
标准 SQL 和LocalTime
Java 中,该值通常表示一天中的时间,没有任何时区或偏移量的概念。因此,其存储不应涉及时区。如果您将中午十二点写入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() ;
推荐阅读
- r - 我将如何正确运行只有一个因素和阻塞设计的 ANOVA?
- powershell - 连接文件 URL 并检查路径 Powershell 错误
- bintray - 如何为 bintray jfrog repo 使用“maven-publish”gradle 插件?
- r - 如何将长 LaTeX 表拆分为相邻列?
- android - Android - 一个一个地在 xml 中为文本视图设置动画
- amazon-s3 - 德鲁伊中的 AWS S3 连接
- python - 使用 BeautifulSoup 从表格中提取彩色文本
- java - 标题中带有嵌套可扩展列表的 Recycleview
- asp.net-core - 在现有 ASP.NET Core MVC 应用程序中实现服务工作者
- sql - SQL Loader Unix - 给出错误 SQL Loader-500 无法打开文件 (ABC_CTL.dat)