Я работаю над планировщиком встреч для клиента, и меня очень расстраивает ошибка, с которой я сталкиваюсь из-за того, что мне постоянно приходится иметь дело с переформатированием дат между utc, строками (с указанием времени начала, например, с 8:00 доместное время, затем местное время и т. д.).
Мне удалось изолировать его от одного вызова метода, но я не могу найти, как в мире разрушается мое обновление sql.
Запись в моей таблице перед вызовом 'update'
appointmentId, customerId, title, description, location, contact, url, start, end, createDate, createdBy, lastUpdate, lastUpdateBy
'21', '3', 'test', 'Consultation', '1', '1', '1', '2018-11-30 18:00:00', '2018-11-30 19:00:00', '2018-11-30 16:17:39', 'test', '2018-11-30 16:17:39', 'test'
Как видно из вышеприведенного, есть две действительные метки времени в 18:00:00 и в 19:00:00, поэтому встреча будет в это время в UTC
private boolean updateForm(){
LocalDate localDate = datePicker.getValue();
LocalTime startTime = LocalTime.parse(startTimeField.getSelectionModel().getSelectedItem(), timeDTF);
LocalTime endTime = LocalTime.parse(endTimeField.getSelectionModel().getSelectedItem(), timeDTF);
LocalDateTime startDT = LocalDateTime.of(localDate, startTime);
LocalDateTime endDT = LocalDateTime.of(localDate, endTime);
ZonedDateTime startUTC = startDT.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"));
ZonedDateTime endUTC = endDT.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"));
Timestamp startsqlts = Timestamp.valueOf(startUTC.toLocalDateTime()); //this value can be inserted into database
Timestamp endsqlts = Timestamp.valueOf(endUTC.toLocalDateTime()); //this value can be inserted into database
System.out.println("Timestamp value start: " + startsqlts.toString() + " end: " + endsqlts.toString());
//OUTPUT OF ABOVE
//"Timestamp value start: 2018-11-30 18:00:00.0 end: 2018-11-30 19:00:00.0"
try{
PreparedStatement st = sqlConnection.prepareStatement("UPDATE appointment SET customerId = ?, title = ?, description = ?, start = ?, end = ?, lastUpdate = CURRENT_TIMESTAMP, lastUpdateBy = ? WHERE appointmentId = ?");
st.setString(1, Integer.toString(customerTable.getSelectionModel().getSelectedItem().getId().getValue().intValue()));
st.setString(2, titleField.getText());
st.setString(3, typeField.getValue());
//Inserting timestamps directly
st.setTimestamp(4, startsqlts);
st.setTimestamp(5, endsqlts);
st.setString(6, mainScheduler.currentUser);
st.setString(7, Integer.toString(appointment.getId().getValue().intValue()));
if(st.executeUpdate() > 0){
System.out.println("Updated appointment");
return true;
}else{
System.out.println("Failed to update appointment");
}
}catch(Exception e){
e.printStackTrace();
}
return false;
}
Как вы можете видеть выше из выходных данных, которые я поместил под печатью, временные метки действительны, но после выхода из этого вызова и просмотра таблицы я получаю следующее: ( Ничто иное не изменяет мою таблицу между этим вызовом и временемЯ проверяю ):
appointmentId, customerId, title, description, location, contact, url, start, end, createDate, createdBy, lastUpdate, lastUpdateBy
'21', '3', 'test', 'Consultation', '1', '1', '1', '2018-12-01 02:00:00', '2018-12-01 03:00:00', '2018-11-30 16:17:39', 'test', '2018-11-30 16:29:00', 'test'
Что показывает, что загрузка добавляет 8 часов к уже отформатированной метке времени.
Как это исправить?Это была единственная проблема, из-за которой мое приложение не работало почти неделю, и я просто изолировал его, поэтому любая помощь очень ценится.
Для справки: я на 8 часов отстал от UTC, поэтому мое местное время + 8 часов= UTC.
РЕДАКТИРОВАТЬ: Если не очевидно, я вызываю обновление без изменений, чтобы было легче увидеть изменения отражены.