2017-01-12 6 views
2

데이터베이스에 유지해야하는 문자열 형식의 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을 (를) 데이터베이스에 저장하는 이유는 무엇입니까? 이것에 가치있는 정보를 친절하게 제공하십시오.

+0

java/jpa를 모르므로이 질문은 멍청 할 수도 있지만 데이터베이스에 값을 삽입하는 코드는 어디에 있습니까? 타임 스탬프 값을 어떻게 전달하고 있습니까? 내 추측은 DB의 서버가 ASIA/KOLKATA 시간대에 설정되어 있고 타임 스탬프 값을 전달할 때 시간대를 지정하지 않는다는 것입니다 (예, "Z"는 ISO 타임 스탬프 형식의 UTC를 의미하며, 오라클 db는 타임 존 형식 마스크에서 어떤 의미도 붙지 않습니다.) 따라서 타임 스탬프 값은 마치 UTC가 아닌 로컬 시간대에있는 것처럼 저장됩니다. – Boneist

답변

0

데이터 표현의 문제 일 수도 있습니다. 날짜는 정확하게 저장되지만 DBMS (또는 쿼리 브라우저)는 해당 데이터를 로컬 형식으로 표시합니다.

특정 기능 (예 : ORACLE의 경우 sys_extract_utc(timestamp))을 사용하여 테스트하거나 다른 유효한 저장된 날짜와 쿼리로 비교하여 테스트 할 수 있습니다.

희망이 있습니다.

+0

나는 sys_extract_utc를 사용하여 UTC 시간을 저장하지 않는다고 확인했다. –