英文:
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;
...
}
但是在我的网页上提取信息时,显示的时间比数据库中的时间少了一个小时,这该如何修复?
英文:
I have a database which has a movie schedule. Well, of course there are two such columns:
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)
);
I have entity in java code:
@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;
...
}
But pulling information to my web page gives one hour less than is in the database for my region. How can this be fixed?
答案1
得分: 2
OffsetTime
还有一个名为OffsetTime
的类。但是那个类对我和其他人来说都没有意义。我猜想这个类仅仅被包含在 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();
英文:
OffsetTime
There is also a class OffsetTime
. But that class makes no sense to me and to other folks. I presume he class was included in java.time merely to provide a counterpart to such a type defined in the SQL standard. The type in SQL also makes no sense. I mention these types only for the sake of completeness; I do not recommend their use.
LocalTime
For both TIME
in standard SQL and LocalTime
in Java, the value represents a time-of-day generically, without any concept of time zone or offset. So there should be no time zones involved in its storage. If you write twelve noon 12:00:00.0
to the database, you should get back twelve noon.
myPreparedStatement.setObject( … , myLocalTime ) ;
And retrieval.
LocalTime myLocalTime = myResultSet.getObject( … , LocalTime.class ) ;
ZonedDateTime
If you are selling tickets to a particular showing of a movie in a cinema, you must combine that time of day with a date and a time zone.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate tomorrow = LocalDate.now( z ).plusDays( 1 ) ;
ZonedDateTime zdtTicket = ZonedDateTime.of( tomorrow , myLocalTime , z ) ;
See that same moment in UTC.
Instant instant = zdtTicket.toInstant() ;
答案2
得分: 1
LocalTime
没有TimeZone
。您需要使用ZonedDateTime
代替。
英文:
LocalTime
does not have TimeZone
. You have to use ZonedDateTime
instead.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论