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