Так что недавно я работал с типом данных Calendar и Date в своем проекте и не мог вставить (и получить) правильное количество часов в (из) мою базу данных (используя Spring и Hibernate / MySql5Dialect).
Когда я пытался использовать хранимую процедуру в своем приложении Spring, которая бы выбирала некоторые даты (тип данных DATETIME) из БД, объект, возвращаемый в Java, всегда находится за час до фактической даты в моей БД (например, 2019-03-30 09:00:00 в моем БД, и я получаю 2019-03-30 08:00:00 от моего обслуживания). Теперь, когда я вызываю ту же процедуру в mysql workbench, она работает отлично.
Теперь я заметил, когда пытался вставить запись с датой внутри нее из моего весеннего приложения, например, 2019-03-30 09:00:00, я получаю 2019-03-30 08:00:00 в своей базе данных, вот как я вставил дату:
private PatientAppointmentDTOR createPatientAppointmentDTOR() {
PatientAppointmentDTOR dtor = factory.manufacturePojo(PatientAppointmentDTOR.class);
dtor.setCpId(5L); // foreign keys...
dtor.setBranchId(2L);
dtor.setPtId(32L);
dtor.setEmployeeId(55L);
dtor.setInDepartmentId(7L);
dtor.setPatientAppointmentStatusId(20L);
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.YEAR, 2019);
cal1.set(Calendar.MONTH, 2);
cal1.set(Calendar.DAY_OF_MONTH,30);
cal1.set(Calendar.HOUR_OF_DAY, 12);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
cal1.set(Calendar.MILLISECOND, 0);
Date start = cal1.getTime();
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, 2019);
cal2.set(Calendar.MONTH, 2);
cal2.set(Calendar.DAY_OF_MONTH,30);
cal2.set(Calendar.HOUR_OF_DAY, 12);
cal2.set(Calendar.MINUTE, 30);
cal2.set(Calendar.SECOND, 0);
cal2.set(Calendar.MILLISECOND, 0);
Date end = cal2.getTime();
dtor.setStartTime(start);
dtor.setEndTime(end);
Company company = companyService.getEntityById(5L);
GroupDTOS gdtos = groupService.getDTOById(2L);
when(auth.userDetails())
.thenReturn(EntityFactory
.createUserDetails(DBStaticFields.Role.CLINIC_ADMIN, company, gdtos, factory));
return dtor;
}
, а затем я просто вставил это в свою базу данных, используя этот тест JUnit:
@Test
@DisplayName("test insertion")
void testInsert() {
PatientAppointmentDTOR dtor = this.createPatientAppointmentDTOR();
PatientAppointmentDTOS dtos = patientAppointmentService.insert(dtor);
assertThat(dtos).isNotNull();
assertThat(dtos.getId()).isNotNull();
}
Так что да, когда я вставляю эти значения из моего приложения, startDate в моей базе данных - 2019-03-30 11:00:00, а endDate - 2019-03-30 11:30:00,У кого-нибудь есть идеи?