1. 程式人生 > >Unix時間戳和Java中的時間戳的區別

Unix時間戳和Java中的時間戳的區別

前言

最近在使用阿里的日誌服務時,遇到了一些Java中Timestamp的坑,所以特意做了瞭解並整理了一下。在這之前首先得介紹一下Unix時間戳:

Unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。

但是Java中很多獲取時間戳的API並不是獲取到Unix時間戳,而是獲取到從1970年1月1日(UTC/GMT的午夜)開始所經過的毫秒數。以毫秒計算的時間戳下面統一稱為時間戳

Java中獲取時間戳的API

以獲取當前時間的時間戳為例,下面將展示多種獲取時間戳的辦法: 1. 我們最常用的System類中就有獲取當前時間戳的API:System.currentTimeMillis()

。 2. 說道常用的類,其實日期類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());
4. 而說到了時間戳就不得不提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;
    }