程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> System.nanoTime與System.currentTimeMillis的理解與區別,currenttimemillis

System.nanoTime與System.currentTimeMillis的理解與區別,currenttimemillis

編輯:JAVA綜合教程

System.nanoTime與System.currentTimeMillis的理解與區別,currenttimemillis


 

System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位於java.lang包。

平時產生隨機數時我們經常拿時間做種子,比如用System.currentTimeMillis的結果,但是在執行一些循環中使用了System.currentTimeMillis,那麼每次的結果將會差別很小,甚至一樣,因為現代的計算機運行速度很快。後來看到java中產生隨機數函數以及線程池中的一些函數使用的都是System.nanoTime,下面說一下這2個方法的具體區別。

 System.nanoTime

System.nanoTime提供相對精確的計時,但是不能用他來計算當前日期,在jdk中的說明如下:

public static long nanoTime() 返回最准確的可用系統計時器的當前值,以毫微秒為單位。

此方法只能用於測量已過的時間,與系統或鐘表時間的其他任何時間概念無關。返回值表示從某一固定但任意的時間算起的毫微秒數(或許從以後算起,所以該值可能為負)。此方法提供毫微秒的精度,但不是必要的毫微秒的准確度。它對於值的更改頻率沒有作出保證。在取值范圍大於約 292 年(263 毫微秒)的連續調用的不同點在於:由於數字溢出,將無法准確計算已過的時間。

例如,測試某些代碼執行的時間長度:

long startTime = System.nanoTime();

// ... the code being measured ...

long estimatedTime = System.nanoTime() - startTime;

返回:系統計時器的當前值,以毫微秒為單位。從以下版本開始:1.5

詳細代碼:

public class Test3 {  
    public static void main(String[] args) {  
        String[] a = new String[] { "aaa", "aaa", "ccc" };  
        String[] b = new String[] { "aaa", "bbb", "ccc" };  
        Clock clock = Clock.getClock();  
        long start = System.nanoTime(); // 獲取開始時間  
        System.out.println(equals(a,b));  
        long end = System.nanoTime(); // 獲取結束時間  
        clock.stopAndPrint("耗時:");  
        System.out.println(end + "===" + start);  
    }  
    //比較兩個string[] 無序是否相等  
    public static boolean equals(String a[],String b[]){     
           if(a.length!=b.length) return false;     
           int n=a[0].hashCode()^b[0].hashCode();     
           for(int i=1;i<a.length;i++){     
                n^=a[i].hashCode()^b[i].hashCode();     
          }     
           if(n==0) return true;     
             return false;     
        }    
}  

 

java。lang包

 

/**
     * Returns the current value of the most precise available system
     * timer, in nanoseconds.
     *
     * <p>This method can only be used to measure elapsed time and is
     * not related to any other notion of system or wall-clock time.
     * The value returned represents nanoseconds since some fixed but
     * arbitrary time (perhaps in the future, so values may be
     * negative).  This method provides nanosecond precision, but not
     * necessarily nanosecond accuracy. No guarantees are made about
     * how frequently values change. Differences in successive calls
     * that span greater than approximately 292 years (2<sup>63</sup>
     * nanoseconds) will not accurately compute elapsed time due to
     * numerical overflow.
     *
     * <p> For example, to measure how long some code takes to execute:
     * <pre>
     *   long startTime = System.nanoTime();
     *   // ... the code being measured ...
     *   long estimatedTime = System.nanoTime() - startTime;
     * </pre>
     * 
     * @return The current value of the system timer, in nanoseconds.
     * @since 1.5
     */

 

System.currentTimeMillis

System.currentTimeMillis返回的是從1970.1.1 UTC 零點開始到現在的時間,精確到毫秒,平時我們可以根據System.currentTimeMillis來計算當前日期,星期幾等,可以方便的與Date進行轉換,下面時jdk中的介紹:

public static long currentTimeMillis() 返回以毫秒為單位的當前時間。注意,當返回值的時間單位是毫秒時,值的粒度取決於底層操作系統,並且粒度可能更大。例如,許多操作系統以幾十毫秒為單位測量時間。

請參閱 Date 類的描述,了解可能發生在“計算機時間”和協調世界時(UTC)之間的細微差異的討論。

返回:當前時間與協調世界時 1970 年 1 月 1 日午夜之間的時間差(以毫秒為單位測量)。

所以在使用中,我們可以根據我們具體的目的去正確的選擇他們。

currentTimeMillis方法

public static long currentTimeMillis()

該方法的作用是返回當前的計算機時間,時間的表達格式為當前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數。

可以直接把這個方法強制轉換成date類型。

代碼如下:

long currentTime = System.currentTimeMillis();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH時mm分ss秒");

Date date = new Date(currentTime);

System.out.println(formatter.format(date));
運行結果如下:
當前時間:2011年-08月10日-14時11分46秒
另:
可獲得當前的系統和用戶屬性:
       String osName = System.getProperty(“os.name”);
  String user = System.getProperty(“user.name”);
  System.out.println(“當前操作系統是:” + osName);
  System.out.println(“當前用戶是:” + user);
       System.getProperty 這個方法可以得到很多系統的屬性。

java.lang包:

 /**
     * 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
     */

一、時間的單位轉換

1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
1秒=1,000,000,000 納秒(ns) 1納秒=1/1,000,000,000秒(s)
1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s)

1分鐘=60秒

1小時=60分鐘=3600秒

二、System.currentTimeMillis()計算方式

在開發過程中,通常很多人都習慣使用new Date()來獲取當前時間。new Date()所做的事情其實就是調用了System.currentTimeMillis()。如果僅僅是需要或者毫秒數,那麼完全可以使用System.currentTimeMillis()去代替new Date(),效率上會高一點。如果需要在同一個方法裡面多次使用new Date(),通常性能就是這樣一點一點地消耗掉,這裡其實可以聲明一個引用。

可以看出輸出的時間是當前時間的一個小時後。

 

System.currentTimeMillis()+3600*1000)可以這樣解讀:System.currentTimeMillis()相當於是毫秒為單位,但是,後頭成了1000,就變成了以秒為單位。那麼,3600秒=1小時,所以輸出為當前時間的1小時後。

我們可以這樣控制時間:System.currentTimeMillis()+time*1000),裡面傳入的time是以秒為單位,當傳入60,則輸出:當前時間的一分鐘後

可以看出輸出的時間是當前時間的一分鐘後。

      有不足之處,敬請諒解!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved