更新带有时间戳的表,尝试再次转换为UTC?

时间:2018-11-30 16:39:34

标签: java mysql jdbc

我正在为一个客户安排约会计划程序,但我遇到了一个错误,我感到沮丧,因为我经常需要处理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。

编辑: 如果不太明显,我将调用没有更改的更新,以便更容易看到更改。

0 个答案:

没有答案