[英]Convert Joda Date Time String To Java.Sql.TimeStamp for an INSERT
[英]How to use Joda-Time with java.sql.Timestamp
我有一份准備好的聲明
INSERT INTO mst(time) VALUES (?);
其中time是PostgreSQL數據庫中Timestamp的類型。
我正在插入一個Joda-Time DateTime對象,或者我應該說我正在嘗試。 我找不到將DateTime對象轉換為java.sql.Timestamp的方法 。 我已經閱讀了Joda-Time文檔並且沒有參考這個。
謝謝。
您可以先將Joda DateTime轉換為long(自紀元以來的millis),然后再創建一個Timestamp。
DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
JodaTime的DateTime構造函數現在可以為您處理。 (我不確定問題發布后是否屬實,但這是谷歌的最高結果,所以我想我會添加一個更新的解決方案。)
有幾個API選項:
public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);
這兩個選項都接受java.sql.Timestamp,因為它擴展了java.util.Date,但是Nanoseconds將被忽略(floored),因為DateTime和Date只有毫秒級的分辨率*。 如果沒有特定的時區,它將默認為DateTimeZone.UTC。
<教學模式>
“分辨率”是提供多少位數。 “精確度”是表示的准確程度。 例如,MSSQL的DateTime具有毫秒級的分辨率,但只有1/3的精度(DateTime2具有可變分辨率和更高的精度)。
</ Didactic Mode>
具有毫秒分辨率的UTC時間戳示例:
new DateTime(resultSet.getTimestamp(1));
如果您在數據庫中使用TIMESTAMP WITH TIME ZONE,則無法使用java.sql.Timestamp,因為它不支持時區。 您必須使用ResultSet#getString並解析字符串。
沒有時區的時間戳和第二個分辨率示例**:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseLocalDateTime(resultSet.getString(1));
帶有第二個分辨率示例的UTC時間戳示例**:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseDateTime(resultSet.getString(1));
帶時區的時間戳(偏移格式)和第二個分辨率示例**:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
.parseDateTime(resultSet.getString(1));
Bonus:DateTimeFormat#forPattern按模式靜態緩存解析器,因此您不必這樣做。
<教學模式>
我通常建議在DBO模型中使用String,以使分辨率明確,避免生成中間對象。 (2013-11-14 09:55:25是否等於2013-11-14 09:55:25.000?)我通常會嘗試區分“數據庫模型對象”優化數據保存問題和“業務模型對象”優化服務級別使用,其間包含轉換/映射層。 我發現基於CRUD的DAO直接生成業務對象往往會混淆優先級並優化兩者,因為錯過邊緣情況而從意外的位置拋出異常。 擁有顯式轉換層還允許您在必要時添加驗證,例如,如果您不控制數據源。 分離問題還可以更容易地獨立測試每個層。
</ Didactic Mode>
*如果您需要在商業模式中解析為納秒分辨率,則必須使用不同的庫。
**時間戳字符串格式可能因數據庫而異,但不確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.