데이터베이스에 유지해야하는 문자열 형식의 UTC 시간이 나타납니다.UTC JPA를 사용하여 오라클 열 (TIMESTAMP WITH TIMEZONE)에 시간이 저장되지 않음
(UTC 날짜/시간 문자열) 아래 코드를 사용하여 만든 달력 객체.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
OffsetDateTime dateTime = OffsetDateTime.parse(rqTime,formatter);
System.out.println(dateTime);
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTime(Date.from(dateTime.toInstant()));
그리고 JPA
EventDetails eventDetails = new EventDetails();
eventDetails.setTimeWithZone(cal);
event.insertEventDetails(eventDetails);
Entity 클래스 정보에 위의 설정 달력 인스턴스를 생성
@Entity
@Table(name="mytimestamptz")
public class EventDetails implements Serializable{
private static final long serialVersionUID = 1L;
@Column(name ="made_on" , columnDefinition = "TIMESTAMP WITH TIME ZONE")
@Type(type="com.elitecore.isl.bl.xlink.custom.UTCCalendarType")
private Calendar timeWithZone ;
@Id
@SequenceGenerator(name = "generator", sequenceName = "SEQ_EVENTID", allocationSize = 1)
@Column(name ="id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
private Long id;
이 코드 삽입 UTC의 날짜 문자열 "2016-01-01T13 : 14 : 15 + 0000 "을"01-JAN-2016 13:14:15 +0530 "으로 설정하십시오 (UTCCalendarType 참조).
UTCCalendarType 데이터베이스
public class UTCCalendarType extends CalendarType {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
/**
* This is the original code from the class, with two changes. First we pull
* it out of the result set with an example Calendar. Second, we set the new
* calendar up in UTC.
*/
@Override
public Object get(ResultSet rs, String name) throws SQLException {
Timestamp ts = rs.getTimestamp(name, new GregorianCalendar(UTC));
if (ts != null) {
Calendar cal = new GregorianCalendar(UTC);
cal.setTime(ts);
return cal;
} else {
return null;
}
}
@Override
public void set(PreparedStatement st, Object value, int index) throws SQLException {
final Calendar cal = (Calendar) value;
cal.setTimeZone(UTC);
System.out.println("IST TIME : "+cal.getTime());
st.setTimestamp(index, new Timestamp(cal.getTime().getTime()),Calendar.getInstance(UTC));
}
}
이 코드에 잘못가는 뭐죠 내가지고 있지 않다에서 UTC 형식으로 날짜 저장하기 위해 만들었습니다. ASIA/KOLKATA TIMEZONE을 (를) 데이터베이스에 저장하는 이유는 무엇입니까? 이것에 가치있는 정보를 친절하게 제공하십시오.
java/jpa를 모르므로이 질문은 멍청 할 수도 있지만 데이터베이스에 값을 삽입하는 코드는 어디에 있습니까? 타임 스탬프 값을 어떻게 전달하고 있습니까? 내 추측은 DB의 서버가 ASIA/KOLKATA 시간대에 설정되어 있고 타임 스탬프 값을 전달할 때 시간대를 지정하지 않는다는 것입니다 (예, "Z"는 ISO 타임 스탬프 형식의 UTC를 의미하며, 오라클 db는 타임 존 형식 마스크에서 어떤 의미도 붙지 않습니다.) 따라서 타임 스탬프 값은 마치 UTC가 아닌 로컬 시간대에있는 것처럼 저장됩니다. – Boneist