Assuming you have a JVM that will be up all the time, say an app server that never restarts: compute the next time the report should run, compute the milliseconds between then and now, make a
Java Timer that will wait that long and then execute and compute a new next time.
Because JVMs don't stay up forever, you probably need to persist the "next scheduled run" in a file or database or whatever. At JVM startup, read the stored time and set up the Timer.
Or invest a little time in learning Quartz which does all this and more.
Any of that seem to work for your problem?