java 中,new Date() 方法,獲取的時間,究竟與當前的系統時間有什麼關聯?簡單的時刻對應關係嗎?html
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
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()); } }
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
更新測試主方法:orm
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秒),更新系統時間,此時,控制檯輸出的時間,以更新後的時間爲基準進行輸出。進程
現象:肯定不是在 JVM啓動時,內部維護該時刻。
可是依然不肯定該時刻是調用 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; }