【问题标题】:How to Increment and Decrement time in Linux with Java如何使用 Java 在 Linux 中增加和减少时间
【发布时间】:2014-08-02 03:23:05
【问题描述】:

出于测试目的,我需要更改 Linux 中的系统时间。到目前为止我所做的是:

Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.HOUR_OF_DAY, 2); //example of a 2 hour alteration
alterSystemTime(calendar.getTime().toString());

public void alterSystemTime(String newTime) {
    Runtime.getRuntime().exec("sudo date -s \"" + newTime + "\"");
}

我要重置时间:

public void resetTime() {
    Runtime.getRuntime().exec("sudo hwclock --hctosys");
}

alterSystemTime 方法中正在执行的命令示例如下:

sudo date -s "Fri Aug 01 12:15:47 BRT 2014"

这在终端上执行时可以正常工作,但不适用于代码。我已正确配置 etc/sudoers 文件以运行 sudo 命令而无需输入密码。 resetTime 函数按预期工作。我还尝试将日期解析为这样的格式化字符串:

sudo date -s "2014/08/01 11:53:17"

这同样适用于终端,但不适用于程序。

那么,为什么我的方法 alterSystemTime() 不起作用?这是更改系统时间的正确方法吗?

编辑:

根据 Sid 的回答,我在方法上使用了这个:

Runtime.getRuntime().exec(new String[]{ "sudo", "date", "--set", newTime })

【问题讨论】:

  • 当你运行sudo date但它不起作用时,是否有错误信息?
  • 如何记录 exec 返回?
  • 用它来记录stackoverflow.com/a/7715334/869783输出是空的。
  • exec().exitValue() 返回“1”。

标签: java linux datetime


【解决方案1】:

尝试将字符串数组传递给.exec()

Runtime.getRuntime().exec(new String[]{ "date", "--set", "2014-08-01 11:53:17" });

【讨论】:

  • @MarcioB 您需要检查是否正在产生某种错误。 .exec() 方法返回一个 Process 对象。您需要访问该对象的输入、输出和错误流。请参阅此链接,该链接向您展示如何访问 OutputStreamInputStreamstackoverflow.com/questions/3936023/…。您可以采取类似的方法来获取ErrorStream
  • 我就是这么做的,看看我对这个问题的评论。
  • @MarcioB 好的。您是否尝试过执行其他一些 shell 命令?它们有用吗?
  • 是的,问题中的方法 resetTime() 工作正常。
  • @MarcioB 所以我想在不添加sudo 的情况下运行它是行不通的。尝试使用具有sudo 的用户运行整个程序。如果这不起作用,那么您也可以尝试:new String[]{ "sudo date", "--set"...new String[]{ "sudo", "date", "--set"...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
相关资源
最近更新 更多