如何在Java中设置系统时间?

2022-09-02 02:30:19

是否可以在 Java 中更改系统时间?

它应该在Windows和Linux下运行。我已经尝试了类,但权限有问题。Runtime

这是我的代码:

String cmd="date -s \""+datetime.format(ntp_obj.getDest_Time())+"\"";
try {
    Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
// TODO Auto-generated catch block
  e1.printStackTrace();
}
System.out.println(cmd);

的输出为:cmd

date -s "06/01/2011 17:59:01"

但系统时间与以前相同。

我将设置时间,因为我正在编写NTP客户端,在那里我从NTP服务器获得时间并进行设置。


答案 1

Java没有API来做到这一点。

大多数系统命令都需要管理员权限,因此除非您以管理员/root身份运行整个过程或使用 /,否则无济于事。Runtimerunassudo

根据需要,可以替换 .有两种方法可以解决这个问题:System.currentTimeMillis()

  1. 将所有对 的调用替换为对您自己的静态方法的调用,您可以替换该静态方法:System.currentTimeMillis()

    public class SysTime {
        public static SysTime INSTANCE = new SysTime();
    
        public long now() {
            return System.currentTimeMillis();
        }
    }
    

    对于测试,您可以使用其他时间返回的内容覆盖 INSTANCE。添加更多方法以创建和类似对象。Date

  2. 如果并非所有代码都在您的控制之下,请安装 一个 返回 的不同实现。这比您想象的要简单:ClassLoaderSystem

    @Override
    public Class<?> loadClass( String name, boolean resolve ) {
        if ( "java.lang.System".equals( name ) ) {
            return SystemWithDifferentTime.class;
        }
    
        return super.loadClass( name, resolve );
    }
    

答案 2

一种方法是使用本机命令。

对于 Windows,需要两个命令(日期和时间):

Runtime.getRuntime().exec("cmd /C date " + strDateToSet); // dd-MM-yy
Runtime.getRuntime().exec("cmd /C time " + strTimeToSet); // hh:mm:ss

对于 linux,单个命令同时处理日期和时间:

Runtime.getRuntime().exec("date -s " + strDateTimeToSet); // MMddhhmm[[yy]yy]

9 年后更新

这不是设置系统时间的好方法,而不是使用来获取当前时间并在需要的地方提供模拟实现以伪造时间。java.util.Clock


推荐