將 java.sql.Timestamp 轉換為 java.util.Calendar
一、簡介
在本教程中,我們將學習如何將java.sql.Timestamp
物件轉換為java.util.Calendar
物件。
首先,我們將了解 Java 的兩個類別Timestamp
和Calendar,
是如何處理時間的。然後,我們將探討執行轉換的常見用例。最後,我們將研究如何從一個物件轉換為另一個物件。
2.爪哇時間
一般來說,我們處理的時間以毫秒為單位,一毫秒等於千分之一秒。如果我們需要更高的精度,另一個常用的精度是奈秒(十億分之一秒)。
java.sql.Timestamp
類別是java.util.Date
物件的子類,具有奈秒的整數表示形式。它是一個旨在與來自 SQL 資料庫的時間戳資料類型一起使用的類別。時間表示為自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數,並添加上述小數秒欄位以提高精度。
另一方面, java.util.Calendar
類別允許我們從Timestamp
中提取日、月或年資訊。我們還可以使用它來獲取有關未來時間的數據,或擴展我們自己的Calendar
實現。 Calendar
也不能處理高於毫秒的精確度,我們稍後將對此進行探討。
3. 轉換時間對象
轉換這兩種類型的主要用例是當我們需要從資料庫中提取時間戳字段時。我們的應用程式可能需要向使用者顯示一個值,或在時間戳記落在特定時間範圍內時採取操作。通常,我們會嘗試使用 Java 8 中引入的更新、功能更強大的java.time
類,但對於一些舊版 API 來說,這並不總是可行。
3.1. Timestamp
Calendar
無論哪種情況,一旦我們有了Timestamp
對象,我們就可以將其轉換為Calendar
:
Timestamp timestamp = new Timestamp(1713544200801L);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp.getTime());
正如我們在上面看到的,我們可以使用Timestamp
的getTime()
方法來設定Calendar
的時間。為了簡單起見,我們使用毫秒值範例建立了Timestamp
。為了確保我們完成了正確的轉換,我們甚至可以對其進行測試:
assertEquals(calendar.getTimeInMillis(), timestamp.getTime());
一旦我們驗證了轉換正確,我們就可以根據需要繼續使用我們的Calendar
。
3.2. Calendar
到Timestamp
我們的測試確保兩個物件的毫秒數相符。然而,值得注意的是, Timestamp
精確到納秒,當我們將Calendar
轉換回Timestamp
時,我們會失去這種精度:
int nanos = 801789562;
int losslessNanos = 801000000;
Timestamp timestamp = new Timestamp(1713544200801L);
timestamp.setNanos(nanos);
assertEquals(nanos, timestamp.getNanos());
Calendar calendar = SqlTimestampToCalendarConverter.timestampToCalendar(timestamp);
timestamp = SqlTimestampToCalendarConverter.calendarToTimestamp(calendar);
assertEquals(losslessNanos, timestamp.getNanos());
這裡,當呼叫Timestamp
的getTime()
方法將其轉換為毫秒時,其奈秒欄位在內部使用整數除法除以 1,000,000。這樣做後,我們最終將原始值801789562
奈秒值減少了 801 毫秒。
因此,如果我們的任務需要奈秒精度,我們應該使用另一種解決方案。
4。
在本文中,我們了解到Timestamp
和Calendar
都以紀元時間以來的毫秒為單位處理時間。此外,我們發現Timestamp
類別追蹤納秒,根據我們的要求,這可能很有用。
透過探索這些物件的用法,我們學習如何將Timestamp
轉換為Calendar
,這在與特定日曆欄位(如日或月)互動時非常有用。
與往常一樣,我們範例的完整原始程式碼可以在 GitHub 上取得。