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 forSystem
. 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 ); }