Как я могу преобразовать из MySQL DATETIME в java.time.Instant и показать пользователю в системном часовом поясе по умолчанию? - PullRequest
1 голос
/ 20 апреля 2019

Я работаю над проектом для школы, и я в полной растерянности. Вот фон:

Я работаю над приложением JavaFX для встреч, которое будет запускаться локально, поэтому мне не нужно беспокоиться о том, что часовой пояс на стороне сервера будет отличаться от реального времени пользователя. Я не могу использовать любые сторонние библиотеки. В настоящее время приложение использует DatePicker и два элемента управления ComboBox для ввода пользователем значений Date, Hour и Minute. Они хранятся в объекте Appointment в переменной Instant (начало) с традиционными методами get / set. Я успешно пишу в БД из элементов управления, и мои результаты отображаются так, как я и ожидал. Если я выберу 31/06/2019 и 12:00, а затем запишу его в БД, он отобразится в БД, которая хранится в столбце «Начало» (с типом данных DATETIME) как 2019-12-31 17:00: 00. Я нахожусь в CST, поэтому мое смещение UTC составляет -5 часов. До этого момента я считаю, что все персиковое.

Отсюда что-то идет на юг. Я сопоставляю каждое из назначений БД с объектом ObservableList, используя что-то подобное для каждого элемента в ResultSet

Instant start = i_rs.getTimestamp("start").toInstant();
Return newAppointment(start);

Проверка значения переменной Instant Start дает мне:

2019-12-31T17: 00

как я и ожидал. Однако я не могу успешно преобразовать это время в часовой пояс пользователя. Самое близкое, что я пришел, это:

ZonedDateTime localStartDate = currentAppointment
            .getStart()
            .atZone(ZoneId.systemDefault());

Но это возвращает

2019-12-31T17: 00-05: 00

Я тоже пробовал

ZonedDateTime zdt = date.atZone(ZoneOffset.systemDefault());

Но это превращает мое время в неправильное направление, оставляя меня с

2019-12-31T22: 00

Я работал над этой маленькой "легкой" частью более суток. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 апреля 2019
ZonedDateTime localStartDate = currentAppointment
  .getStart()
  .atZone(ZoneId.systemDefault());

Здесь вы говорите: «У меня есть метка времени, относитесь к ней как к CST». Вот почему она становится «17: 00-05: 00»

Кажется, вы храните свои метки времени в UTC (еслитогда вы не советуете изменить код написания, чтобы он всегда сохранялся в UTC), поэтому вы должны сообщить об этом Java

ZonedDateTime localStartDate = currentAppointment
  .getStart()
  .atZone(ZoneId.of("UTC")) // my instant is UTC
  .withZoneSameInstant(ZoneId.systemDefault()) // convert to my local zone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...