【问题标题】:Get system uptime in Java在 Java 中获取系统正常运行时间
【发布时间】:2013-01-25 20:57:33
【问题描述】:

我如何确定计算机开机的时间(以毫秒为单位)?

【问题讨论】:

标签: java system


【解决方案1】:

在 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;
}

【讨论】:

  • @KerrM 我很遗憾没有尽快注意到你的 cmets!在 Mac 上,第一个小时的输出格式是什么?实际上,我完全根据文档编写了此方法的 OSX/Linux 部分,因为我无法轻松访问这两种操作系统。
  • @JavDev 目前正处于决赛阶段,但由于我现在可以轻松访问 linux 系统,因此给自己写了一个便条,以便在几天后回到这个问题。一旦发生这种情况,我会再次 ping 你!
  • 否决了这个答案,因为它仅适用于 Windows,前提是您的操作系统语言和设置与建议的 SimpleDateFormat 中的内容相匹配。如果在操作系统设置中更改日期格式,则日期/时间模式将不匹配。同样,如果您的操作系统语言不是英语,则“Statistics since”将在 net 命令输出中以操作系统语言打印并且不匹配。因此,答案可能在您的计算机上有效,但在国外的客户网站上无效。
  • @jumar 好点。 iTech 的答案是否适用于其他语言?
  • 在 Windows 10 企业版上,我不得不将 net stats srv 更改为 net stats workstation
【解决方案2】:

使用适用于 Windows、Linux 和 Mac OS 的OSHI library

new SystemInfo().getOperatingSystem().getSystemUptime()

【讨论】:

  • “Windows、Linux 和 Mac OS”以及 FreeBSD 和 Solaris。 ;)
  • @DanielWiddis 我不知道,谢谢。让 OSHI 更有说服力!
【解决方案3】:

您可以使用OSHI 库。这是示例代码

System.out.println("Uptime: "+FormatUtil.formatElapsedSecs(new oshi.SystemInfo().getOperatingSystem().getSystemUptime()));

为了让它工作需要添加以下依赖项。

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.4.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.4.0</version>
</dependency>

【讨论】:

    【解决方案4】:

    我真的想不出一种不依赖操作系统的方法来做到这一点。 一个选项是使用ManagementFactory.getRuntimeMXBean().getUptime(); 这会返回您的 JVM 正常运行时间,因此不完全是您正在寻找的,但已经朝着正确的方向迈出了一步。

    您究竟想用这些数据完成什么?

    【讨论】:

    • 结果以哪种数据类型返回?我正在寻找系统登录时间以在我的应用程序中使用,以提醒用户系统在特定时间没有关闭。如果有,请更新代码。谢谢
    • @JavDev 以 long 形式返回正常运行时间的毫秒数
    【解决方案5】:

    对于 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();
        }
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2012-09-11
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      相关资源
      最近更新 更多