我想將 ZonedDateTime 存盤在 Oracle 中的 TIMESTAMP WITH TIME ZONE 資料型別中。如果我試圖將字串直接存盤為字串,它會拋出無效月份。然后我發現我可以在java中將其轉換為TIMESTAMPTZ然后存盤,因為我們需要將字串轉換為TIMESTAMPTZ及其拋出錯誤。
String d = "2021-10-28 02:36:08.000000 02:00";
TIMESTAMPTZ t = new TIMESTAMPTZ(con, d);
PreparedStatement ps = con.prepareStatement(query);
ps.setObject(1,t);
錯誤/堆疊跟蹤:
Exception in thread "main" java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] at java.sql.Timestamp.valueOf(Timestamp.java:251) at oracle.sql.TIMESTAMPTZ.toBytes(TIMESTAMPTZ.java:1919) at oracle.sql.TIMESTAMPTZ.<init>(TIMESTAMPTZ.java:253) at OracleSelectQuery.main(OracleSelectQuery.java:21)
有人請看看這個。
uj5u.com熱心網友回復:
時間
在下面的表格描述了ANSI SQL型別的映射java.time型別:
| ANSI SQL | Java SE 8 |
|---|---|
| 日期 | 本地日期 |
| 時間 | 當地時間 |
| 時間戳 | 本地日期時間 |
| 時區時間 | 偏移時間 |
| 帶時區的時間戳 | 偏移日期時間 |
將給定的日期時間字串決議OffsetDateTime為如下所示:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX", Locale.ENGLISH);
String strDateTime = "2021-10-28 02:36:08.000000 02:00";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtf);
System.out.println(odt);
}
}
輸出:
2021-10-28T02:36:08 02:00
ONLINE DEMO
現在,您可以將其存盤OffsetDateTime到資料庫中,如下所示:
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
從Trail: Date Time 中了解有關現代日期時間 API * 的更多資訊。
* 如果您正在為 Android 專案作業并且您的 Android API 級別仍然不符合 Java-8,請檢查通過 desugaring 可用的 Java 8 API。請注意,Android 8.0 Oreo 已提供對java.time.
uj5u.com熱心網友回復:
三引數 TIMESTAMPTZ(Connection, Timestamp, ZoneId) 建構式
根據 OracleTIMESTAMPTZ類的檔案(底部鏈接),它有一個建構式,除了連接之外,它還將 ajava.sql.Timestamp和 ajava.time.ZoneId作為引數(過時和現代 Java 類的有趣混合)。由于我們可以ZoneOffset從您的字串中提取 a并且ZoneOffset是 的子類ZoneId,因此我們可以將這個建構式用于您的目的:
String d = "2021-10-28 02:36:08.000000 02:00";
OffsetDateTime odt = OffsetDateTime.parse(d, PARSER);
Instant inst = odt.toInstant();
ZoneId offsetAsZoneId = odt.getOffset();
TIMESTAMPTZ t = new TIMESTAMPTZ(con, Timestamp.from(inst), offsetAsZoneId);
我使用這個格式化程式進行決議:
private static final DateTimeFormatter PARSER = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.appendLiteral(' ')
.appendOffsetId()
.toFormatter(Locale.ROOT);
您還可以將時區保存到 Oracle
我使用的建構式接受了一個ZoneId額外的可能性,我們可以將歐洲/巴黎或亞洲/加爾各答等實時時區 ID 存盤到資料庫中,而不僅僅是一個裸露的 UTC 偏移量。至少按照我閱讀 Oracle 資料庫檔案的方式,它的timestamp with time zone資料型別可以包含時區 ID。檔案中給出的示例是 America/Los_Angeles。
用于轉換的一個簡單的例子ZonedDateTime為TIMESTAMPTZ:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
Instant inst = zdt.toInstant();
ZoneId zid = zdt.getZone();
TIMESTAMPTZ t = new TIMESTAMPTZ(con , Timestamp.from(inst), zid);
鏈接
TIMESTAMPTZ及其TIMESTAMPTZ(Connection, Timestamp, ZoneId)建構式的檔案。- Oracle 資料庫日期時間資料型別和時區支持幫助,日期時間和間隔資料型別部分。向下滾動到TIMESTAMP WITH TIME ZONE Data Type。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313692.html
上一篇:將作業日添加到df列
