By Cratylus


2010-11-10 07:57:55 8 Comments

I am trying to convert a long value (number of milliseconds elapsed from 1/1/1970 i.e. Epoch) to time of format h:m:s:ms.

The long value I use as timestamp, I get from the field timestamp of a logging event from log4j.

So far I've tried the following and it fails:

logEvent.timeStamp/ (1000*60*60)
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

but I get incorrect value:

1289375173771 for logEvent.timeStamp
358159  for logEvent.timeStamp/ (1000*60*60) 
21489586 for TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

How do I go about this?

9 comments

@Joel Richard Koett 2018-12-07 23:06:20

    long hours = TimeUnit.MILLISECONDS.toHours(timeInMilliseconds);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours));
    long seconds = TimeUnit.MILLISECONDS
            .toSeconds(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes));
    long milliseconds = timeInMilliseconds - TimeUnit.HOURS.toMillis(hours)
            - TimeUnit.MINUTES.toMillis(minutes) - TimeUnit.SECONDS.toMillis(seconds);
    return String.format("%02d:%02d:%02d:%d", hours, minutes, seconds, milliseconds);

@manolowar 2010-11-10 08:12:05

Try this:

Date date = new Date(logEvent.timeSTamp);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateFormatted = formatter.format(date);

See SimpleDateFormat for a description of other format strings that the class accepts.

See runnable example using input of 1200 ms.

@JohnyTex 2014-08-19 11:41:20

Comment: HH will print the hour at that date (0-23), not the total amount of hours elapsed since 1970. Just sayin'.

@keiki 2016-04-01 10:30:02

And don't forget. Old SimpleDateFormat can't be used multithreaded.

@Naveen Kumar R B 2017-01-04 11:06:02

to import SimpleDateFormat, use the import as follows: import java.text.*;

@Basil Bourque 2018-05-07 20:06:14

FYI, the troublesome old date-time classes such as java.util.Date, java.util.Calendar, and java.text.SimpleDateFormat are now legacy, supplanted by the java.time classes built into Java 8 and later. See Tutorial by Oracle. See:stackoverflow.com/a/4142428/642706

@Raulp 2019-02-20 08:32:58

whats the type of logevent?Can you please put in the Question?

@Brajendra Pandey 2013-05-13 11:26:34

long millis = durationInMillis % 1000;
long second = (durationInMillis / 1000) % 60;
long minute = (durationInMillis / (1000 * 60)) % 60;
long hour = (durationInMillis / (1000 * 60 * 60)) % 24;

String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);

@Ondrej Burkert 2014-01-17 15:08:29

I like your solution better than the accepted answer as it is a bit more explicit and does not suffer problems with locale. Though you miss the final part: millis = millis % 1000, which would rightly put milliseconds at the end of the formatted string.

@Wesley De Keirsmaeker 2014-03-11 09:50:00

Multiplications and division are associative. (millis / (1000 * 60)) is the same as (millis / 1000 * 60)

@Alphaaa 2014-04-14 15:48:20

@WesleyDeKeirsmaeker, in general, readability is more important than conciseness.

@baboo 2014-09-11 10:42:09

why remainder with 24 for hours ?

@farnett 2015-02-16 22:05:39

Division is not associative: 50000 / (1000 * 60) = 0.8333333333 while 50000 / 1000 * 60= 3000.

@Adreamus 2015-09-25 00:18:26

'millis = millis % 1000' is missing :D\n and if you need days, here you go: 'long days = (millis /(1000*60*60*24));'

@Timmmm 2016-06-03 08:57:28

What about leap seconds?

@Lambart 2016-07-12 18:46:05

@WesleyDeKeirsmaeker you are wrong; in Java, (millis / 1000 * 60) is the same as ((millis / 1000) * 60), NOT (millis / (1000 * 60))

@Wesley De Keirsmaeker 2016-07-14 09:24:33

You are correct.

@Kirill Karmazin 2017-03-19 19:52:48

if 'hours' is the biggest partition you will use, and you won't use 'days' - in this case remove "% 24" from the line "long hour = (millis / (1000 * 60 * 60)) % 24;"

@Abandoned Cart 2017-05-15 17:44:20

@Alphaaa Hopefully you have realized since that comment that readability is only preferred when it does not sacrifice conciseness. I would hate to think you have been publishing inaccurate code for the sake of source readability all this time.

@Alphaaa 2017-05-17 08:05:14

@LoungeKatt I don't understand why you define more readable code as "inaccurate". I remember this passage from Norvig's "Artificial Intelligence: A Modern Approach" where he was illustrating that in boolean logic NOT+AND or NOT+OR are sufficient... but we write expressions using NOT+AND+OR "because readability is often more important than conciseness" (don't remember the exact words).

@Abandoned Cart 2017-05-17 19:41:47

@Alphaaa TL;DR I do not define more readable code as inaccurate. I define elaborate explanations for simple tasks as prone to error.

@bong jae choe 2017-11-16 05:35:54

i love this answer!

@Super Mario's Yoshi 2018-12-27 03:41:10

For second you can simply use long second = (durationInMillis / 1000), we do not need %60 at the end, same goes for minutes we do not need %60

@Sean Patrick Floyd 2010-11-10 08:16:03

I'll show you three ways to (a) get the minute field from a long value, and (b) print it using the Date format you want. One uses java.util.Calendar, another uses Joda-Time, and the last uses the java.time framework built into Java 8 and later.

The java.time framework supplants the old bundled date-time classes, and is inspired by Joda-Time, defined by JSR 310, and extended by the ThreeTen-Extra project.

The java.time framework is the way to go when using Java 8 and later. Otherwise, such as Android, use Joda-Time. The java.util.Date/.Calendar classes are notoriously troublesome and should be avoided.

java.util.Date & .Calendar

final long timestamp = new Date().getTime();

// with java.util.Date/Calendar api
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
// here's how to get the minutes
final int minutes = cal.get(Calendar.MINUTE);
// and here's how to get the String representation
final String timeString =
    new SimpleDateFormat("HH:mm:ss:SSS").format(cal.getTime());
System.out.println(minutes);
System.out.println(timeString);

Joda-Time

// with JodaTime 2.4
final DateTime dt = new DateTime(timestamp);
// here's how to get the minutes
final int minutes2 = dt.getMinuteOfHour();
// and here's how to get the String representation
final String timeString2 = dt.toString("HH:mm:ss:SSS");
System.out.println(minutes2);
System.out.println(timeString2);

Output:

24
09:24:10:254
24
09:24:10:254

java.time

long millisecondsSinceEpoch = 1289375173771L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneOffset.UTC );

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HH:mm:ss:SSS" );
String output = formatter.format ( zdt );

System.out.println ( "millisecondsSinceEpoch: " + millisecondsSinceEpoch + " instant: " + instant + " output: " + output );

millisecondsSinceEpoch: 1289375173771 instant: 2010-11-10T07:46:13.771Z output: 07:46:13:771

@Cratylus 2010-11-10 08:59:17

Is there any performance reason or any other reason, I should preffer Joda over Calendar?

@Sean Patrick Floyd 2010-11-10 09:06:26

in simple cases like this, no. In general: Joda's api is designed better. e.g. java Dates are mutable Joda DateTimes are not. Joda is also more programmer friendly, you can access almost all functionality from the DateTime class without having to convert back and forth between Date and Calendar

@Cratylus 2010-11-10 09:33:44

does it have any dependencies I should be aware?

@Sean Patrick Floyd 2010-11-10 09:37:10

No dependencies, it's a standalone library

@Basil Bourque 2014-09-09 00:29:30

Good answer, but I suggest also specifying the time zone rather than rely implicitly on the JVM’s current default time zone. So the call to constructor of DateTime would have a second argument, a DateTimeZone object. Like this: new DateTime( timestamp, DateTimeZone.forID( "America/Montreal" ) )

@Sean Patrick Floyd 2015-10-29 08:41:16

@BasilBourque thx for the edit. nice job

@Basil Bourque 2016-12-02 06:36:31

@Cratylus The java.time classes supplant both Joda-Time and the old legacy date-time classes bundled with Java. Joda-Time inspired the java.time classes, both projects led by the same man, Stephen Colbourne.

@LeoZao 2015-09-07 05:22:28

Try this:

    String sMillis = "10997195233";
    double dMillis = 0;

    int days = 0;
    int hours = 0;
    int minutes = 0;
    int seconds = 0;
    int millis = 0;

    String sTime;

    try {
        dMillis = Double.parseDouble(sMillis);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }


    seconds = (int)(dMillis / 1000) % 60;
    millis = (int)(dMillis % 1000);

    if (seconds > 0) {
        minutes = (int)(dMillis / 1000 / 60) % 60;
        if (minutes > 0) {
            hours = (int)(dMillis / 1000 / 60 / 60) % 24;
            if (hours > 0) {
                days = (int)(dMillis / 1000 / 60 / 60 / 24);
                if (days > 0) {
                    sTime = days + " days " + hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                } else {
                    sTime = hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                }
            } else {
                sTime = minutes + " min " + seconds + " sec " + millis + " millisec";
            }
        } else {
            sTime = seconds + " sec " + millis + " millisec";
        }
    } else {
        sTime = dMillis + " millisec";
    }

    System.out.println("time: " + sTime);

@Vivek Pal 2015-01-21 04:27:12

public static String timeDifference(long timeDifference1) {
long timeDifference = timeDifference1/1000;
int h = (int) (timeDifference / (3600));
int m = (int) ((timeDifference - (h * 3600)) / 60);
int s = (int) (timeDifference - (h * 3600) - m * 60);

return String.format("%02d:%02d:%02d", h,m,s);

@Lo Ka 2014-05-22 16:42:42

long second = TimeUnit.MILLISECONDS.toSeconds(millis);
long minute = TimeUnit.MILLISECONDS.toMinutes(millis);
long hour = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.SECONDS.toMillis(second);
return String.format("%02d:%02d:%02d:%d", hour, minute, second, millis);

@Derek Mahar 2018-07-05 16:34:29

This doesn't seem correct. Does TimeUnit.MILLISECONDS.toSeconds(), for example, convert milliseconds to the same duration in seconds or the remaining seconds after subtracting hours and minutes? The solution requires the latter.

@Omar El Don 2018-07-08 07:54:26

not correct....

@0ddlyoko 2019-03-12 12:07:38

This method is incorrect, it returns 431220:25873204:1552392282:0 if I want to convert the date of 12 march 2019 at 13h04 42s

@YoCha 2014-02-27 14:49:58

It is possible to use apache commons (commons-lang3) and its DurationFormatUtils class.

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.1</version>
</dependency>

For example:

String formattedDuration = DurationFormatUtils.formatDurationHMS(12313152);
// formattedDuration value is "3:25:13.152"
String otherFormattedDuration = DurationFormatUtils.formatDuration(12313152, DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN);
// otherFormattedDuration value is "P0000Y0M0DT3H25M13.152S"

Hope it can help ...

@Nico Huysamen 2010-11-10 08:06:09

Doing

logEvent.timeStamp / (1000*60*60)

will give you hours, not minutes. Try:

logEvent.timeStamp / (1000*60)

and you will end up with the same answer as

TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

@Cratylus 2010-11-10 08:08:10

But TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp) also gives my garbage. 21489586 is not minutes!

@Nico Huysamen 2010-11-10 08:15:14

It is the number of minutes passed since 01/01/1970.

@Cratylus 2010-11-10 08:25:02

Ok, so how do I get the format I want? I.e. 10:50:40:450?I do not know how to use the number of minutes since 1970.

@Nico Huysamen 2010-11-10 08:43:24

O sorry, just thought you wanted to know how to make sense of it. See the post by seanizer, that should cover it.

Related Questions

Sponsored Content

19 Answered Questions

[SOLVED] Converting string into datetime

  • 2009-01-21 18:00:29
  • Oli
  • 2540939 View
  • 1911 Score
  • 19 Answer
  • Tags:   python datetime

58 Answered Questions

[SOLVED] How do I read / convert an InputStream into a String in Java?

35 Answered Questions

26 Answered Questions

[SOLVED] How to get an enum value from a string value in Java?

  • 2009-03-02 22:56:34
  • Malachi
  • 1008851 View
  • 1832 Score
  • 26 Answer
  • Tags:   java enums

16 Answered Questions

[SOLVED] How can I convert a Unix timestamp to DateTime and vice versa?

43 Answered Questions

[SOLVED] How do I convert a String to an int in Java?

33 Answered Questions

[SOLVED] How to split a string in Java

  • 2010-08-14 03:01:53
  • riyana
  • 3595583 View
  • 1501 Score
  • 33 Answer
  • Tags:   java string

16 Answered Questions

[SOLVED] Converting 'ArrayList<String> to 'String[]' in Java

26 Answered Questions

[SOLVED] Convert a Unix timestamp to time in JavaScript

8 Answered Questions

[SOLVED] Converting datetime.date to UTC timestamp in Python

  • 2012-01-08 13:03:31
  • Andreas Jung
  • 473989 View
  • 269 Score
  • 8 Answer
  • Tags:   python datetime utc

Sponsored Content