System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位於java.lang包。
平時產生隨機數時我們經常拿時間做種子,比如用System.currentTimeMillis的結果,但是在執行一些循環中使用了System.currentTimeMillis,那麼每次的結果將會差別很小,甚至一樣,因為現代的計算機運行速度很快。後來看到java中產生隨機數函數以及線程池中的一些函數使用的都是System.nanoTime,下面說一下這2個方法的具體區別。
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返回的是從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秒
在開發過程中,通常很多人都習慣使用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,則輸出:當前時間的一分鐘後
可以看出輸出的時間是當前時間的一分鐘後。
有不足之處,敬請諒解!!