new Date() 方法究竟是獲取什麼時間

一、問題

java 中,new Date() 方法,獲取的時間,究竟與當前的系統時間有什麼關聯?簡單的時刻對應關係嗎?html

二、測試環境

  • 版本:jdk1.8.0_131
  • 主方法:
    public static void main(String[] args) throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        int i = 0;
        while(true){
            System.out.println(i + "\t" +dateFormat.format( new Date() ) );
            i++;
            Thread.sleep(2000);
        }
    }

三、更新時間前

更新時間前

如上圖所示,控制檯輸出的時間,與當前的系統時間一致。java

四、更新時間後

保持該main方法一直在運行(不中斷,一直在死循環中), 利用win10下的時間設置,更改系統時間後測試

更新時間後

如上圖所示,控制檯輸出的時間,依然以更新時間前的爲基準進行輸出。this

五、代碼溯源

  • Date.java
package java.util;
public class Date
    /**
     * Allocates a <code>Date</code> object and initializes it so that
     * it represents the time at which it was allocated, measured to the
     * nearest millisecond.
     *
     * @see     java.lang.System#currentTimeMillis()
     */
    public Date() {
        this(System.currentTimeMillis());
    }
}
  • System.java
package java.lang;
public final class System {
    /**
     * Returns the current time in milliseconds.  Note that
     * while the unit of time of the return value is a millisecond,
     * the granularity of the value depends on the underlying
     * operating system and may be larger.  For example, many
     * operating systems measure time in units of tens of
     * milliseconds.
     *
     * <p> See the description of the class <code>Date</code> for
     * a discussion of slight discrepancies that may arise between
     * "computer time" and coordinated universal time (UTC).
     *
     * @return  the difference, measured in milliseconds, between
     *          the current time and midnight, January 1, 1970 UTC.
     * @see     java.util.Date
     */
    public static native long currentTimeMillis();
}

六、分析

現象:JVM 在某一時刻,獲取當前系統時間,同時內部維護該時間(或者說時刻更爲準確),後續全部的時間操做,均以此時刻爲基準。rest

因爲不肯定該時刻是JVM啓動時,仍是調用 new Date() 方法時;同時爲了排除SimpleDateFormat相關方法故繼續測試。code

七、 繼續測試1

更新測試主方法:orm

  • 要點:肯定該時刻,同時排除SimpleDateFormat相關方法影響
public static void main(String[] args) throws InterruptedException {
    int i = 0;
    System.out.println("開始---" );
    Thread.sleep(10000);
    System.out.println("正式輸出---" );
    while(true){
        System.out.println(i + "\t" + new Date() );
        i++;
        Thread.sleep(2000);
    }
}

說明:在Thread.sleep(10000) ,利用這段時間(10秒),更新系統時間htm

分析與繼續測試

如上圖,更新系統時間前,JVM進程已經啓動。blog

分析與繼續測試

如上圖,利用這段時間(10秒),更新系統時間,此時,控制檯輸出的時間,以更新後的時間爲基準進行輸出。進程

八、繼續測試2

現象:肯定不是在 JVM啓動時,內部維護該時刻。

可是依然不肯定該時刻是調用 new Date() 方法時,仍是調用 **System.currentTimeMillis()**時(參見 五、代碼溯源 部分 ),故繼續測試。

更新測試主方法:

  • 要點:在調用new Date()前,先行調用System.currentTimeMillis() 方法。
    public static void main(String[] args) throws InterruptedException {
        int i = 0;
        System.out.println("開始---" );
        System.out.println("當前系統時間對應的毫秒數:" + System.currentTimeMillis());
        Thread.sleep(10000);
        System.out.println("正式輸出---" );
        while(true){
            System.out.println(i + "\t" + new Date() );
            i++;
            Thread.sleep(2000);
        }
    }

測試方法同上一部分,即:

利用這段時間(10秒),更新系統時間.

分析與繼續測試

現象:該時刻不以調用 System.currentTimeMillis() 時爲基準。

九、 分析

System.currentTimeMillis()產生一個當前的毫秒,這個毫秒其實就是自1970年1月1日0時起的毫秒數,Date()其實就是至關於Date(System.currentTimeMillis()); 由於Date類還有構造Date(long date),用來計算long秒與1970年1月1日之間的毫秒差。獲得了這個毫秒數,咱們本身也能夠算起如今的年月日周時

上述文字,參考:JAVA獲取當前時間System.currentTimeMillis()_百度經驗

十、猜測

new Date()第一次執行時,獲取當前系統時間,同時內部維護該時間(或者說時刻更爲準確),後續全部的時間操做,均以此時刻爲基準。

繼續查閱Date.java 方法

private transient long fastTime;

public Date() {
    this(System.currentTimeMillis());
}
public Date(long date) {
    fastTime = date;
}
相關文章
相關標籤/搜索