Значение из MySQL TIME в Java Date неправильно переводится - PullRequest
0 голосов
/ 20 сентября 2019

В моей базе данных MySQL у меня есть таблица с тремя столбцами, как показано ниже

id | name | notification_time
-----------------
1  | name1 | 00:30:00
2  | name2 | 01:30:00
3  | name3 | 01:00:00

messages_time - это тип данных TIME.

В моем приложении Spring-boot для моделирования таблицы Iиметь

@Entity
@Table(name = "table")
public class TableEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "notification_time")
    @Temporal(TemporalType.TIME)
    private Date notificationTime;

И для извлечения значений я просто извлекаю все записи из своего репозитория

tableRepository.findAll();

Когда я извлекаю Время_ уведомлений из базы данных, значение, которое я вижу для каждого, равно

19:30:00
20:30:00
20:00:00

так что похоже на смещение времени от значения в моей таблице, но на 19 часов?Вместо этого я хотел бы сохранить значения из моей таблицы (т.е. 00:30:00, 01:30:00, 01:00:00).Есть ли причина для такого поведения и способ исправить это?

1 Ответ

0 голосов
/ 21 сентября 2019

Происходит то, что дата сохраняется в MSSQL как UTC.Как правило, это желательно, поскольку при запуске экземпляров приложения из нескольких регионов вы не хотите видеть три 19:00 в вашей базе данных в случае, если LocalDateTime - 18:00 в одном часовом поясе, 19:00 в другом и 20:00 веще один.Если у вас есть причина предпочитать видеть местное время, то вы можете либо указать Зону в Java, вычесть разницу в часах между местным временем и временем utc из вашего поля времени, либо преобразовать данные в вашей базе данных всякий раз, когда вам нужно выполнить запросы SELECT..

Скажем, вы знаете, что ваш местный часовой пояс - Восток США, вы можете сделать что-то подобное в Java:

timeNow.setHours(LocalDateTime.now().getHours() - ChronoUnit.HOURS.between(LocalDateTime.now(), LocalDateTime.now(ZoneOffset.UTC)));

или что-то подобное в SQL:

SELECT CONVERT(TIME, a_time AT TIME ZONE 'US Eastern Standard Time') FROM    
   schema.your_table;

Я бы определенно избежал Java, просто приведу пример на тот случай, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...