Java中時間戳的獲取和轉(zhuǎn)換的示例分析
日期時間是Java一個重要的數(shù)據(jù)類型,常見的日期時間格式通常為“yyyy-MM-dd HH:mm:ss”,但是計算機中存儲的日期時間并非字符串形式,而是長整型的時間戳。因為字符串又占用空間又難以運算,相比之下,長整型只占用四個字節(jié),普通的加減乘除運算更是不在話下,所以時間戳是最佳的日期時間存儲方案。獲取時間戳的代碼很簡單,只需調(diào)用System類的currentTimeMillis方法即可,如下所示:
// 從System類獲取當前的時間戳long timeFromSystem = System.currentTimeMillis();System.out.println('timeFromSystem='+timeFromSystem);
眾所周知,時間戳以毫秒為單位,為了求得它的計時起點,可以將其轉(zhuǎn)換時間單位,先把毫秒的數(shù)量轉(zhuǎn)成秒的數(shù)量,再把秒的數(shù)量轉(zhuǎn)成分鐘的數(shù)量,再把分鐘的數(shù)量轉(zhuǎn)成小時的數(shù)量,再把小時的數(shù)量轉(zhuǎn)成天的數(shù)量,最后把天的數(shù)量轉(zhuǎn)成年的數(shù)量。不過每年的天數(shù)不固定,像平年有365天,閏年有366天,按照四年一閏,平均每年的天數(shù)=(365+365+365+366)/4=365.25。于是把時間戳轉(zhuǎn)為年份數(shù)量的代碼就成了下面這樣:
int years = (int) (timeFromSystem/1000/60/60/24/365.25);System.out.println('years='+years);
運行上述轉(zhuǎn)換代碼,可見如下的輸出日志:
timeFromSystem=1595578123444years=50
由于當前年份是2020,從2020往前倒推50年,正好是1970年,原來時間戳是從1970年開始累加的呀。通過System類只是獲取時間戳的第一種方式,正如茴香豆的茴有四種寫法那樣,時間戳也有四種獲取方式,除了之前提到的System類,還有下列三種時間戳獲取方式:
1、從Date實例獲取時間戳
調(diào)用Date實例的getTime方法即可獲得對應(yīng)的時間戳,獲取代碼示例如下:
// 從日期實例獲取對應(yīng)的時間戳long timeFromDate = new Date().getTime();System.out.println('timeFromDate='+timeFromDate);
2、從Calendar實例獲取時間戳
調(diào)用Calendar實例的getTimeInMillis方法即可獲得對應(yīng)的時間戳,獲取代碼示例如下:
// 從日歷實例獲取對應(yīng)的時間戳long timeFromCalendar = Calendar.getInstance().getTimeInMillis();System.out.println('timeFromCalendar='+timeFromCalendar);
3、從LocalDateTime實例獲取時間戳
從LocalDateTime獲取時間戳稍微麻煩些,得先把LocalDateTime實例轉(zhuǎn)為Instant實例,再調(diào)用Instant實例的toEpochMilli方法獲得對應(yīng)的時間戳,獲取代碼示例如下:
// 從本地日期時間實例獲取對應(yīng)的時間戳LocalDateTime localDateTime = LocalDateTime.now();Instant instant1 = localDateTime.toInstant(ZoneOffset.ofHours(8));long timeFromLocal1 = instant1.toEpochMilli();System.out.println('timeFromLocal1='+timeFromLocal1);
上面獲取代碼基于北京時間,所以轉(zhuǎn)為Instant實例時使用了東八區(qū),倘若在東八區(qū)以外的其他地區(qū)運行上述代碼,就無法得到正確的當?shù)貢r間戳,此時要先設(shè)置當?shù)氐哪J時區(qū),再將LocalDateTime實例轉(zhuǎn)為Instant實例,獲取代碼示例如下:
Instant instant2 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();long timeFromLocal2 = instant1.toEpochMilli();System.out.println('timeFromLocal2='+timeFromLocal2);
盡管時間戳的獲取方式多達四種,然而最高效的還是第一種System方式,它不但代碼最簡潔,時間消耗也最小。
有了時間戳之后,還能將它轉(zhuǎn)換為對應(yīng)的日期、日歷和本地日期時間。轉(zhuǎn)換過程說明如下:1、把時間戳轉(zhuǎn)換為Date類型,調(diào)用Date實例的setTime方法即可。2、把時間戳轉(zhuǎn)換為Calendar類型,調(diào)用Calendar實例的setTimeInMillis方法即可。3、把時間戳轉(zhuǎn)換為LocalDateTime類型,先調(diào)用Instant類的ofEpochMilli方法,把時間戳轉(zhuǎn)成Instant實例;再調(diào)用LocalDateTime類的ofInstant方法,把Instant實例轉(zhuǎn)成LocalDateTime實例。下面是把時間戳轉(zhuǎn)為日期、日歷和本地日期時間的代碼例子:
// 從System類獲取當前的時間戳long timestamp = System.currentTimeMillis();// 下面把時間戳轉(zhuǎn)換為日期實例Date date = new Date();date.setTime(timestamp);// 下面把時間戳轉(zhuǎn)換為日歷實例Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(timestamp);// 下面把時間戳轉(zhuǎn)換為本地日期時間實例Instant instant = Instant.ofEpochMilli(timestamp);LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
到此這篇關(guān)于Java中時間戳的獲取和轉(zhuǎn)換的示例分析的文章就介紹到這了,更多相關(guān)Java 時間戳 獲取轉(zhuǎn)換內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. XML在語音合成中的應(yīng)用2. HTTP協(xié)議常用的請求頭和響應(yīng)頭響應(yīng)詳解說明(學習)3. 不要在HTML中濫用div4. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)5. .NET Framework各版本(.NET2.0 3.0 3.5 4.0)區(qū)別6. jscript與vbscript 操作XML元素屬性的代碼7. HTML5實戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)8. php使用正則驗證密碼字段的復(fù)雜強度原理詳細講解 原創(chuàng)9. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過程和條件語句)10. XML入門的常見問題(三)
