今天的主題,從頭到尾就兩個字:時間。
堅持看完整篇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 + "毫秒");
}
}
四、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=?
輸出日誌:
五、結尾
再次回到我們的主題,時間。
大叔,有一次面試“某福報廠”,面試官問了一個問題,讓我陷入沉思了很久很久很久……以下是面試官的原話:
在我們公司,有着很多狠多的學霸,假如,你加入我們之後,你會發現很多來自國內外名校,智商很高的同事。他們學習能力很強。你怎麼能做到不落後甚至超越他們呢?
大叔,思考了很久很久,終於找到了適合大叔的答案:時間
程序員,面對快速迭代的技術,持續學習的能力無疑是殺手鐗,短時間我們學習的速度趕不上學霸,但是持之以恆的學習,一個個技術細節慢慢啃,夜以繼日的啃,不敢說能趕上大部分學霸,最起碼能讓研發能力領先在中上水平以上。
隨着時間的力量,這個領先會越來越領先。
時間可以是把殺豬刀,時間也可以是把屠龍刀。
逝者如斯夫,我相信時間的力量,堅持的力量。
積跬步,終將至千里;積小流,必成江海。
原文連接:https://juejin.im/post/5eb00f786fb9a043340bf6a8
更多android技術blog:https://juejin.im/collection/5eaff93ee51d45364b88a912
關鍵字:
時間戳; 開發技術如何與不落後學霸; 技術能力如何不落後; 程序員必備技能; currentTimeMillis; nanoTime; SystemClock;