Как установить необходимый часовой пояс в LocalTime - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть база данных с расписанием mov ie. Ну, конечно, есть два таких столбца:

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;
    ...

}

Но получение информации на моей веб-странице дает на один час меньше, чем в базе данных для моего региона. Как это можно исправить?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

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

Если Вы продаете билеты на определенный показ фильма ie в кинотеатре, вы должны объединить это время дня с датой и часовым поясом.

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

См. тот же момент в UT C.

Instant instant = zdtTicket.toInstant() ;
1 голос
/ 03 апреля 2020

LocalTime не имеет TimeZone. Вы должны использовать ZonedDateTime вместо.

...