我正在为一个客户安排约会计划程序,但我遇到了一个错误,我感到沮丧,因为我经常需要处理utc,字符串(包含开始时间,例如从8:00 AM到当地时间,然后到localdatetime等)。
我设法将其隔离为单个方法调用,但我找不到世界上如何破坏我的sql更新。
在调用“更新”之前我的表条目
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个小时添加到已格式化的时间戳记中。
该如何补救?这一直是我的应用程序无法使用近一个星期的唯一问题,我只是隔离了它,因此我们将不胜感激。
作为参考,我比UTC晚8小时,所以我的本地时间+ 8小时= UTC。
编辑: 如果不太明显,我将调用没有更改的更新,以便更容易看到更改。