Unix時間戳和Java中的時間戳的區別
阿新 • • 發佈:2018-12-09
前言
最近在使用阿里的日誌服務時,遇到了一些Java中Timestamp的坑,所以特意做了瞭解並整理了一下。在這之前首先得介紹一下Unix時間戳:
Unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
但是Java中很多獲取時間戳的API並不是獲取到Unix時間戳,而是獲取到從1970年1月1日(UTC/GMT的午夜)開始所經過的毫秒數
。以毫秒計算的時間戳下面統一稱為時間戳。
Java中獲取時間戳的API
以獲取當前時間的時間戳為例,下面將展示多種獲取時間戳的辦法:
1. 我們最常用的System
類中就有獲取當前時間戳的API:System.currentTimeMillis()
java.util.Date
也有對應的方法:
//初始化Date物件
Date date=new Date();
//獲取Date物件對應的時間戳
System.out.println(date.getTime());
3. 而除了最早的日期類java.util.Date
其實後續新增的java.util.Calendar
也提供相應的API:
//初始化Calendar物件
Calendar calendar=Calendar.getInstance();
//獲取Calendar物件對應的時間戳
System.out.println(calendar.getTimeInMillis());
java.sql.Timestamp
這個時間戳對應的類:
//初始化Timestamp,需要注意構造方法的入參是一個時間戳
Timestamp timestamp=new Timestamp(System.currentTimeMillis());
//獲取Timestamp物件對應的時間戳
System.out.println(timestamp.getTime());
5. 難道Java中就不能直接獲取Unix時間戳嗎?當然不是,JDK8中新增的java.time.LocalDateTime
就可以直接獲取到Unix時間戳:
//初始化時區物件,北京時間是UTC+8,所以入參為8
ZoneOffset zoneOffset=ZoneOffset.ofHours(8);
//初始化LocalDateTime物件
LocalDateTime localDateTime=LocalDateTime.now();
//獲取LocalDateTime物件對應時區的Unix時間戳
System.out.println(localDateTime.toEpochSecond(zoneOffset));
時間戳與Unix時間戳相互轉換
時間戳與Unix時間戳相互轉換其實很簡單。因為時間戳是以毫秒為單位,而Unix時間戳是以秒為單位,所以可以得到一個公式:Unix時間戳=時間戳*1000
,即時間戳=Unix時間戳/1000
。那麼轉化的程式碼也很簡單:
/**
* 時間戳轉Unix時間戳
* @param timestamp
* @return
*/
public long toUnixTimeStamp(long timestamp){
return timestamp/1000;
}
/**
* Unix時間戳轉時間戳
* @param unixTimeStamp
* @return
*/
public long toTimestamp(long unixTimeStamp){
return unixTimeStamp*100;
}