2017-01-12 6 views
2

データベースに保持する必要がある文字列形式のUTC時刻を取得しています。UTC JPAを使用してOracle列(TIMESTAMP WITH TIMEZONE)に時刻が格納されていません

UTC datetime string以下のコードを使用して作成されたCalenderオブジェクト。

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 
@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 "と指定しても、タイムゾーン情報(Refer 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を知らないので、これは間違った質問かもしれませんが、データベースに値を挿入するコードはどこですか?どのようにタイムスタンプ値を渡していますか?私の推測では、あなたのデータベースのサーバーはASIA/KOLKATAのタイムゾーンに設定されており、タイムスタンプの値を渡すと、タイムゾーンを指定していないことになります(はい、ISOのタイムスタンプ形式では "Z" Oracle DBにはタイムゾーン形式のマスクで意味が付けられていません)、タイムスタンプ値はUTCではなくローカルのタイムゾーンに格納されているため保存されます。 – Boneist

答えて

0

おそらくデータ表現の問題です。日付は正しく保存されていますが、DBMS(またはクエリブラウザ)にはローカル形式で表示されることがあります。

特定の機能(例:ORACLEの場合はsys_extract_utc(timestamp))を使用するか、クエリによって有効な別の保存された日付と比較してテストできます。

希望します。

+0

私はsys_extract_utcを使ってチェックしましたが、それはUTC時間を格納していません。 –

関連する問題