在Java編程中,獲取當(dāng)前時(shí)間戳是一個(gè)常見需求,時(shí)間戳可以保存為long類型的整數(shù),是指從1970年1月1日0時(shí)0分0秒(UTC,即格林威治標(biāo)準(zhǔn)時(shí)間)開始到當(dāng)前時(shí)間的秒數(shù)。以下是幾種獲取Java當(dāng)前時(shí)間戳的方法:
一、使用System.currentTimeMillis()
long timestamp = System.currentTimeMillis();
System.currentTimeMillis()返回從UTC 1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的毫秒數(shù),我們可以直接除以1000轉(zhuǎn)換成秒數(shù),也可以將返回值直接保存到long類型的變量中。
使用System.currentTimeMillis()方法獲取時(shí)間戳的優(yōu)點(diǎn)是方法執(zhí)行速度快,缺點(diǎn)是返回值只能精確到毫秒級,如果需要更精確的時(shí)間戳,可以使用System.nanoTime()方法。
二、使用Instant.now().getEpochSecond()
long timestamp = Instant.now().getEpochSecond();
Instant類是Java 8新增的API,可以用來表示時(shí)間線上的一個(gè)瞬間。可以獲取當(dāng)前的Instant實(shí)例,然后調(diào)用getEpochSecond()方法得到從UTC 1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的秒數(shù)。
使用Instant類獲取時(shí)間戳的優(yōu)點(diǎn)是可以精確到納秒級別,缺點(diǎn)是代碼編寫比較麻煩,而且需要使用Java 8以上的版本。
三、使用new Date().getTime()
long timestamp = new Date().getTime();
在早期版本的Java中,我們可以使用Date類來獲取當(dāng)前時(shí)間戳,調(diào)用getTime()方法可以獲得從UTC 1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的毫秒數(shù)。
使用Date類獲取時(shí)間戳的缺點(diǎn)是它已經(jīng)過時(shí),不建議使用,多線程環(huán)境下可能存在線程安全問題。
四、使用Calendar.getInstance().getTime().getTime()
long timestamp = Calendar.getInstance().getTime().getTime();
我們也可以使用Calendar類來獲取當(dāng)前時(shí)間戳,首先需要獲取一個(gè)實(shí)例,然后調(diào)用getTime()方法得到一個(gè)Date對象,再調(diào)用Date對象的getTime()方法即可獲得時(shí)間戳。
Calendar類獲取時(shí)間戳和Date類類似,同樣已經(jīng)過時(shí),也不建議使用。
五、通過java.sql.Timestamp獲取當(dāng)前時(shí)間戳
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
long ts = timestamp.getTime();
Timestamp類也可以用來表示時(shí)間戳,它可以精確到納秒級別。我們可以創(chuàng)建一個(gè)Timestamp實(shí)例,傳入System.currentTimeMillis()方法的返回值作為參數(shù),然后調(diào)用getTime()方法即可得到時(shí)間戳。
使用Timestamp類獲取時(shí)間戳的缺點(diǎn)是代碼比較冗長,需要創(chuàng)建對象。
六、使用Joda-Time類庫獲取當(dāng)前時(shí)間戳
long timestamp = DateTime.now().getMillis() / 1000;
Joda-Time類庫是常用的Java時(shí)間和日期操作類庫,它提供了多種方式來獲取當(dāng)前時(shí)間戳。
我們可以使用DateTime類來表示當(dāng)前時(shí)間,調(diào)用getMillis()方法可以獲得從UTC 1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的毫秒數(shù),然后除以1000即可得到時(shí)間戳。
使用Joda-Time類庫獲取時(shí)間戳可以簡潔明了,而且可以精確到毫秒級別。