2013-02-10 61 views
3

如何確定計算機已啓動多長時間(以毫秒爲單位)?在Java中獲取系統正常運行時間

+3

這取決於操作系統,但你可能會想要掏出一個命令 – mre 2013-02-10 17:43:18

+1

什麼操作系統?沒有外部第三方庫或JNI沒有辦法。 – 2013-02-10 17:43:58

+0

或者看看http://www.mkyong.com/java/how-do-get-time-in-milliseconds-in-java/ – 2013-02-10 17:46:30

回答

1

我真的不能想到一個非操作系統依賴的方式來做到這一點。 一個選項將使用ManagementFactory.getRuntimeMXBean().getUptime(); 這將返回您的JVM正常運行時間,所以不是你正在尋找的東西,而是朝着正確的方向邁出的一步。

你究竟想用數據來完成什麼?

+0

in結果返回哪個數據類型?我正在尋找系統登錄時間在我的應用程序中使用,以提醒用戶系統在特定時間內未關機。如果有的話,請更新代碼。謝謝 – JavDev 2016-06-04 07:38:54

+0

@JavDev長時間返回正常運行時間的毫秒數 – 2016-06-08 09:44:43

9

在Windows中,您可以執行net stats srv命令,而在Unix中,可以執行uptime命令。必須解析每個輸出以獲取正常運行時間。該方法通過檢測用戶的操作系統自動執行必要的命令。

請注意,這兩個操作都不會以毫秒爲單位返回正常運行時間。

public static long getSystemUptime() throws Exception { 
    long uptime = -1; 
    String os = System.getProperty("os.name").toLowerCase(); 
    if (os.contains("win")) { 
     Process uptimeProc = Runtime.getRuntime().exec("net stats srv"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(uptimeProc.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      if (line.startsWith("Statistics since")) { 
       SimpleDateFormat format = new SimpleDateFormat("'Statistics since' MM/dd/yyyy hh:mm:ss a"); 
       Date boottime = format.parse(line); 
       uptime = System.currentTimeMillis() - boottime.getTime(); 
       break; 
      } 
     } 
    } else if (os.contains("mac") || os.contains("nix") || os.contains("nux") || os.contains("aix")) { 
     Process uptimeProc = Runtime.getRuntime().exec("uptime"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(uptimeProc.getInputStream())); 
     String line = in.readLine(); 
     if (line != null) { 
      Pattern parse = Pattern.compile("((\\d+) days,)? (\\d+):(\\d+)"); 
      Matcher matcher = parse.matcher(line); 
      if (matcher.find()) { 
       String _days = matcher.group(2); 
       String _hours = matcher.group(3); 
       String _minutes = matcher.group(4); 
       int days = _days != null ? Integer.parseInt(_days) : 0; 
       int hours = _hours != null ? Integer.parseInt(_hours) : 0; 
       int minutes = _minutes != null ? Integer.parseInt(_minutes) : 0; 
       uptime = (minutes * 60000) + (hours * 60000 * 60) + (days * 6000 * 60 * 24); 
      } 
     } 
    } 
    return uptime; 
} 
+0

這在正常運行的第一個小時內不起作用。 – KerrM 2014-03-12 09:57:22

+0

在Mac上進行測試 – KerrM 2014-03-12 10:15:38

+0

@KerrM我的不好之處在於不知何故不會注意到您的評論!在Mac上,第一個小時的輸出格式是什麼?我實際上基於文檔編寫了此方法的OSX/Linux部分,因爲我無法輕鬆訪問任何一種類型的操作系統。 – Vulcan 2015-05-21 04:00:58

2

Windows系統可以通過查詢windows WMI

要運行下面的代碼獲得uptime到毫秒級精確度,你需要下載Jawin庫並添加jawin.dll到Eclipse項目的根

public static void main(String[] args) throws COMException { 
    String computerName = ""; 
    String userName = ""; 
    String password = ""; 
    String namespace = "root/cimv2"; 

    String queryProcessor = "SELECT * FROM Win32_OperatingSystem"; 

    DispatchPtr dispatcher = null; 

    try { 

     ISWbemLocator locator = new ISWbemLocator(
       "WbemScripting.SWbemLocator"); 
     ISWbemServices wbemServices = locator.ConnectServer(computerName, 
       namespace, userName, password, "", "", 0, dispatcher); 
     ISWbemObjectSet wbemObjectSet = wbemServices.ExecQuery(
       queryProcessor, "WQL", 0, null); 
     DispatchPtr[] results = new DispatchPtr[wbemObjectSet.getCount()]; 
     IUnknown unknown = wbemObjectSet.get_NewEnum(); 
     IEnumVariant enumVariant = (IEnumVariant) unknown 
       .queryInterface(IEnumVariant.class); 

     enumVariant.Next(wbemObjectSet.getCount(), results); 

     for (int i = 0; i < results.length; i++) { 
      ISWbemObject wbemObject = (ISWbemObject) results[i] 
        .queryInterface(ISWbemObject.class); 

      System.out.println("Uptime: " 
        + wbemObject.get("LastBootUpTime")); 
     } 
    } catch (COMException e) { 
     e.printStackTrace(); 
    } 
相關問題