Is it possible to change the System Time in Java?
It should run under Windows and Linux. I've tried it with the
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);
Java doesn't have an API to do this.
Most system commands to do it require admin rights, so Runtime
can't help unless you run the whole process as administrator/root or you use runas
/sudo
.
Depending on what you need, you can replace System.currentTimeMillis()
. There are two approaches to this:
Replace all calls to System.currentTimeMillis()
with a call to a static method of your own which you can replace:
public class SysTime {
public static SysTime INSTANCE = new SysTime();
public long now() {
return System.currentTimeMillis();
}
}
For tests, you can overwrite INSTANCE with something that returns other times. Add more methods to create Date
and similar objects.
If not all code is under your control, install a ClassLoader
which returns a different implementation for System
. This is more simple than you'd think:
@Override
public Class<?> loadClass( String name, boolean resolve ) {
if ( "java.lang.System".equals( name ) ) {
return SystemWithDifferentTime.class;
}
return super.loadClass( name, resolve );
}