I want to convert the second/milliseconds in this format \"HH:mm:ss\" (for esamples, from 5 seconds to 00:00:05). I tried to get that format in this way:
int mil
Timezones.
The long value 5000
means 5 seconds after the epoch. For the majority of timezones, 5 seconds after the epoch is not 5 seconds past midnight local time.
Java 8 update:
java.time.LocalTime
will handle the idea of a wall-clock "time of day" without you having to worry about the timezones and days implicit in java.util.Date
. If you can use Java 8, and your durations will always be less than a day, then a correct version of your example can be as simple as:
int millis = 5000;
int seconds = millis / 1000; // Maybe no need to divide if the input is in seconds
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
String time = timeOfDay.toString();
(I guess strictly speaking, java.time.Duration
is a better model of what you want, in that it represents a certain number of seconds, rather than a time-of-day. But it's a pain to format into hh:mm:ss, so if you're always dealing with sub-24hour values, TimeOfDay gives you this formatting for free and is otherwise equivalent.)
If you're stuck with Java 7 or below, then explicitly specifying a timezone of GMT
in your example code should give you the output you expect.
Here's a Scala REPL session demonstrating the problem, and Java 7 solution, on my machine:
scala> val millis = 5000
millis: Int = 5000
scala> val df = new java.text.SimpleDateFormat("HH:mm:ss")
df: java.text.SimpleDateFormat = java.text.SimpleDateFormat@8140d380
scala> df.format(millis)
res0: java.lang.String = 01:00:05
scala> df.getTimeZone.getID
res1: java.lang.String = GB
scala> df.getTimeZone.getOffset(millis)
res2: Int = 3600000
scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))
scala> df.format(millis)
res3: java.lang.String = 00:00:05
So you can see that my default time zone is GB
, which has a 1 hour offset from GMT at the time denoted by 5000L
. Setting the timezone to GMT gievs the expected output of 00:00:05
.