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

joe*_*oen 18 java systemtime

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

它应该在Windows和Linux下运行.我已尝试使用RuntimeClass,但权限存在问题.

这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

输出cmd是:

date -s "06/01/2011 17:59:01"
Run Code Online (Sandbox Code Playgroud)

但系统时间与以前相同.

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

Aar*_*lla 24

Java没有用于执行此操作的API.

执行此操作的大多数系统命令都需要管理员权限,因此Runtime除非您以管理员/ root身份运行整个过程或使用runas/,否则无法提供帮助sudo.

根据您的需要,您可以更换System.currentTimeMillis().有两种方法:

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

    public class SysTime {
        public static SysTime INSTANCE = new SysTime();
    
        public long now() {
            return System.currentTimeMillis();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @BoneGoat:不,没有。但是你安装了一个`SecurityManager`,然后这样的事情就不可能了。改用`joda-time`。 (2认同)

Jig*_*shi 22

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

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

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

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

Runtime.getRuntime().exec("date -s " + strDateTimeToSet); // MMddhhmm[[yy]yy]
Run Code Online (Sandbox Code Playgroud)

  • @JigarJoshi linux也适用于Mac吗? (2认同)
  • 当`exec()`为每个调用分配一个新进程时,我建议连接两个windows调用,如下所示:`Runtime.getRuntime().exec("cmd/C date"+ strDateToSet +"&time"+ strTimeToSet);` (2认同)