时间戳总结:System.nanoTime(),System.currentTimeMillis(),SystemClock

4,346 阅读3分钟

今天的主题,从头到尾就两个字:时间。

坚持看完整篇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

五、结尾

再次回到我们的主题,时间。


大叔,有一次面试“某福报厂”,面试官问了一个问题,让我陷入沉思了很久很久很久……以下是面试官的原话:

在我们公司,有着很多狠多的学霸,假如,你加入我们之后,你会发现很多来自国内外名校,智商很高的同事。他们学习能力很强。你怎么能做到不落后甚至超越他们呢?

大叔,思考了很久很久,终于找到了适合大叔的答案:时间

程序员,面对快速迭代的技术,持续学习的能力无疑是杀手锏,短时间我们学习的速度赶不上学霸,但是持之以恒的学习,一个个技术细节慢慢啃,夜以继日的啃,不敢说能赶上大部分学霸,最起码能让研发能力领先在中上水平以上。 随着时间的力量,这个领先会越来越领先。 时间可以是把杀猪刀,时间也可以是把屠龙刀。

逝者如斯夫,我相信时间的力量,坚持的力量。

积跬步,终将至千里;积小流,必成江海。








关键字:

时间戳; 开发技术如何与不落后学霸; 技术能力如何不落后; 程序员必备技能; currentTimeMillis; nanoTime; SystemClock;