即時與長時間操控時間
1.概述
在許多應用程式中,高效的時間操作至關重要。我們需要一些方法來檢索、格式化和對錶示時間的變數進行數學運算。在本教程中,我們將學習如何在 Java 中使用長整型運算來處理日期和時間。
2. Instant
課程
自從 Java 8 推出以來,我們可以使用Instant
類別來表示和操作日期和時間。時間的流逝以 1970 年 1 月 1 日午夜為單位,每 24 小時分為 86400 秒。作為一個很好的近似值,此Java 時間尺度對應於通用的民用時間。
2.1. 毫秒級
我們可以使用Instant
的toEpochMilli()
方法來取得從 1970-01-01T00:00:00Z 開始的毫秒數。此函數傳回一個long
數字。因此,讓我們找出now()
函數所獲得的當前日期和時間對應的毫秒數:
long nowLong = Instant.now().toEpochMilli();
我們可以藉助ofEpochMilli()
函數來逆轉這種轉換:
long someDayLong = 1_753_610_399_076L;
Instant someDay = Instant.ofEpochMilli(someDayLong);
注意long
變數初始化中的底線 '_' 字元。我們可以把它放在任何我們想要的位置;在這裡,我們用它作為千位分隔符號。
2.2. long
加入Instant
Instant
類別提供了一系列方法來執行long.
首先,讓我們檢查plus()
方法。
我們需要提供一個long
類型的時間量和一個表示時間單位的物件。讓我們計算一下從現在起 30 天後的時間:
long expirationPeriod = 2_592_000_000L; // 30 days in milliseconds
Instant now = Instant.now();
Instant expirationTime = now.plus(expirationPeriod, ChronoUnit.MILLIS);
透過應用ChronoUnit.MILLIS
常數,我們要求將long
值解釋為毫秒。
如果我們不想直接指定時間單位,我們可以選擇plusMillis()
方法,它接受一個long
值:
Instant expirationTime = Instant.now().plusMillis(2_592_000_000L);
我們分別使用plusNanos()
和plusSeconds()
方法來加入奈秒和秒。
2.3. 從Instant
中減去long
接下來,我們來看看減法。我們有minus()
函數,其語法與plus()
相同。讓我們將時間倒退一天:
Instant aDayAgo = now.minus(86_400_000L, ChronoUnit.MILLIS); // one day in milliseconds
此外,我們還有專門的函數來減去奈秒、毫秒和秒作為long
整數。它們分別是minusNanos()
、 minusMillis()
和minusSeconds()
。
最後,我們也可以使用「plus」函數集,傳遞負時間間隔作為參數:
Instant aDayAgo = now.plus(-86_400_000L, ChronoUnit.MILLIS);
3. 轉向long
借助 Instant API,我們擁有一套便捷的方法來處理資料時間變數。它還能清晰地解釋其操作的數字。然而, Instant
是一個基於值的類別。這意味著它的物件是不可變的,並且每次操作都會建立呼叫該方法的物件的副本。
另一方面, long
是一種原始類型,因此我們可以處理long
數字,而無需創建額外的物件。
因此,讓我們使用long
整數執行時間操作,並僅套用Instant
類別方法來擷取和顯示格式化的時間。缺點是我們需要自己追蹤數字所代表的含義(例如,毫秒、秒或小時)。
讓我們重寫 30 天有效期的範例:
long expirationPeriod = 30 // number of days
* 24 // hours in one day
* 3600 // seconds in one hour
* 1000L;// from seconds to milliseconds
long nowLong = Instant.now().toEpochMilli();
long expirationTimeLong = nowLong + expirationPeriod;
4. 結論
在本文中,我們學習如何對資料和時間執行算術運算。我們討論了Instant
類別如何將 Java 時間轉換為long
整數型數,以及將長整數型數轉換為 Java 時間。然後,我們對Instant
類別物件和數字執行了加法和減法運算。最後,我們將數學運算轉移到long
整數數上,以減輕創建和移除Instant
物件的負擔。
與往常一樣,範例程式碼可在 GitHub 上取得。