android時間戳總結:System.nanoTime(),System.currentTimeMillis(),SystemClock

今天的主題,從頭到尾就兩個字:時間。

堅持看完整篇blog,一定會有收穫。

開發中經常要用到時間戳,下面將會詳細介紹,如下系統函數的功能和差異 :

  • System.nanoTime()
  • System.currentTimeMillis()
  • SystemClock.uptimeMillis()
  • SystemClock.elapsedRealtime()
  • SystemClock.currentThreadTimeMillis

0、時間的單位:

秒:second

毫秒:Millisecond

微妙:Microsecond

納秒:nanosecond

1秒 = 1000毫秒;1毫秒=1000微秒, 1微秒=1000納秒,

注意:【納秒的單位千萬別弄錯了,馬上我們就會用到這個單位】

1毫秒 = 1000 000納秒;一百萬納秒

1毫秒 = 1000 000納秒;一百萬納秒

1毫秒 = 1000 000納秒;一百萬納秒

一 、System.nanoTime()

單位:納秒

android系統開機到當前的時間

系統設置修改時鐘,不影響該時間。

重啓android系統後該值會重置爲0。

二、System.currentTimeMillis()

單位:毫秒(milliseconds)

從1970.1.1 UTC 零點開始到當前的時間

修改系統時鐘,會直接修改該時間。可以通過該值推算當前系統時鐘的日期和時間。

重啓手機對該時間無影響。

三、System.nanoTime()有什麼用呢?

System.nanoTime:返回的時間單位是納秒,他是毫秒的百萬分之一。遠比毫秒的顆粒度要低。

如下情況,使用,System.currentTimeMillis,計算不出時間差,但是System.nanoTime可以:

public class TimeStampMain {

    public static void main(String[] args) {
        long milliTimeBegin = System.currentTimeMillis();
        long nanoTimeBegin = System.nanoTime();
        for (int i = 0; i < 200; i++){

        }
        long nanoDuration = System.nanoTime() - nanoTimeBegin;
        long milliDuration = System.currentTimeMillis() - milliTimeBegin;

        System.out.println("循環100次消耗的時間:nanoDuration=" + nanoDuration + "納秒, milliDuration=" + milliDuration + "毫秒");
    }
}

日誌1

四、SystemClock

/**

 * milliseconds of non-sleep uptime since boot.

 * 單位:毫秒
 * 系統重啓後將重0開始計算,android系統進入深度睡眠後將會暫停計時
 
**/

long uptimeMillis();



/**

 * Returns milliseconds since boot, including time spent in sleep.

 * 單位:毫秒
 * 系統重啓後將重新開始計算,android系統進入深度睡眠,不會停止計時。

*/

long elapsedRealtime();



/**

 * Returns milliseconds running in the current thread.

 * 單位:毫秒
 * 線程running的時間,線程Sleep的時間不會計入。
 * 

**/

long currentThreadTimeMillis();


SystemClock.currentThreadTimeMillis()

注意currentThreadTimeMillis()返回的是當前線程running的時間,注意是running的時間。我們通過如下例子來理解什麼叫着running的時間。並且單位是毫秒。

new Thread(){

  @Override

  public void run() {

    try {
      Log.w(TG, "currentThreadTimeMillis1=" + SystemClock.currentThreadTimeMillis());//日誌1
      Thread.sleep(20000);//20ms
      Log.w(TG, "currentThreadTimeMillis2=" + SystemClock.currentThreadTimeMillis());//日誌2
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    
  }

}.start();

你猜,日誌輸出currentThreadTimeMillis1=?currentThreadTimeMillis2=?





輸出日誌:
日誌2

五、結尾

再次回到我們的主題,時間。


大叔,有一次面試“某福報廠”,面試官問了一個問題,讓我陷入沉思了很久很久很久……以下是面試官的原話:

在我們公司,有着很多狠多的學霸,假如,你加入我們之後,你會發現很多來自國內外名校,智商很高的同事。他們學習能力很強。你怎麼能做到不落後甚至超越他們呢?

大叔,思考了很久很久,終於找到了適合大叔的答案:時間

程序員,面對快速迭代的技術,持續學習的能力無疑是殺手鐗,短時間我們學習的速度趕不上學霸,但是持之以恆的學習,一個個技術細節慢慢啃,夜以繼日的啃,不敢說能趕上大部分學霸,最起碼能讓研發能力領先在中上水平以上。
隨着時間的力量,這個領先會越來越領先。
時間可以是把殺豬刀,時間也可以是把屠龍刀。

逝者如斯夫,我相信時間的力量,堅持的力量。

積跬步,終將至千里;積小流,必成江海。

原文連接:https://juejin.im/post/5eb00f786fb9a043340bf6a8
更多android技術blog:https://juejin.im/collection/5eaff93ee51d45364b88a912









關鍵字:

時間戳; 開發技術如何與不落後學霸; 技術能力如何不落後; 程序員必備技能; currentTimeMillis; nanoTime; SystemClock;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章