2013-02-10 78 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(); 
    }