https://docs.oracle.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis() says:
Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.
It is not clear to me if I am guaranteed that this code will always print ever increasing (or the same) numbers.
while (1) { System.out.println(System.currentTimeMillis() ); }
currentTimeMillis() method returns the current time in milliseconds. The unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.
This method provides nanosecond precision, but not necessarily nanosecond accuracy. No guarantees are made about how frequently values change. Depending on the system, it can take more than 100 cpu cycles to execute.
json"(February 26, 2019 12:00:00 AM) and that need to be accessed from android app once device's System. currentTimeMillis() returns exact time.
System. currentTimeMillis() returns a Java long . It will always be exactly 64 bits long and will typically have a number of leading zeroes.
The short answer is no, System.currentTimeMillis()
is not monotonic. It is based on system time, and hence can be subject to variation either way (forward or backward) in the case of clock adjustments (e.g. via NTP).
System.nanoTime()
is monotonic, if and only if the underlying platform supports CLOCK_MONOTONIC
-- see the comments on Java bug report 6458294 for a good writeup on some circumstances where this is/isn't true.
(And, as an additional anecdote, I have personally observed (several times) System.currentTimeMillis()
run 'backwards', in the absence of clock adjustments, across threads -- that is, a call to that method in one thread returned a lower value than a call in another thread, even though it occurred chronologically after it in 'real-time')
If you need a monotonic source, System.nanoTime()
on a platform supporting monotonicity is your best option.
No, it will not always be >= all previous calls.
It might not increase every time if you call it several times in quick succession from the same thread (I know this is the = part of >=, but the behavior often surprises people).
If you call it several times in quick succession from multiple threads, it might do any number of things -- it could go slightly back in time across threads by a very small amount, depending on implementation and random chance.
Most seriously, the value might go back in time by a large amount if the user (rare) or an NTP sync (potentially common) adjusts the system clock.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With