I've often not used System.currentTimeMillis() in code, rather I inject an interface into objects that need to know the current time. This interface, lets call it Clock, basically provides a single function getCurrentTime(). Reading Alex Miller - Controlling time I see I'm not alone in this.
... its also very useful event processing systems, you can factor out time-based behaviour, so that the same code can be used for processing historical and realtime events.
This is awesome for unit testing as you can create your own Clock, fix the time, control the rate at which it advances, test rolling over daylight savings time changes, time zones, etc. But all of your code just relies on Clock, which is the standard facade.
... its also very useful event processing systems, you can factor out time-based behaviour, so that the same code can be used for processing historical and realtime events.