58

How to convert System.currentTimeMillis(); to seconds?

long start6=System.currentTimeMillis();
System.out.println(counter.countPrimes(100000000)+" for "+start6);

The console shows me 5761455 for 1307816001290. I can't read how many seconds that is.

Any help?

Francisco Noriega
  • 13,725
  • 11
  • 47
  • 72
J13t0u
  • 811
  • 1
  • 8
  • 19

9 Answers9

101

TimeUnit

Use the TimeUnit enum built into Java 5 and later.

long timeMillis = System.currentTimeMillis();
long timeSeconds = TimeUnit.MILLISECONDS.toSeconds(timeMillis);
Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
JH.
  • 4,147
  • 3
  • 19
  • 20
80
long start = System.currentTimeMillis();
counter.countPrimes(1000000);
long end = System.currentTimeMillis();

System.out.println("Took : " + ((end - start) / 1000));

UPDATE

An even more accurate solution would be:

final long start = System.nanoTime();
counter.countPrimes(1000000);
final long end = System.nanoTime();

System.out.println("Took: " + ((end - start) / 1000000) + "ms");
System.out.println("Took: " + (end - start)/ 1000000000 + " seconds");
abhinonymous
  • 329
  • 2
  • 13
Nico Huysamen
  • 10,217
  • 9
  • 62
  • 88
  • 3
    The time in nanoseconds needs to be divided by 10^9 (1000000000) to display as seconds. Can't edit the answer as I only have to insert 3 characters instead of the 6 required. :] – Lilienthal May 02 '13 at 12:37
  • Sorry, wanted it to be ms instead of s. Thanks for spotting it. – Nico Huysamen May 02 '13 at 13:00
  • 7
    Why would someone want to use `nanoTime()` instead of `currentTimeMillis()` when the result is needed in seconds? – Uooo May 02 '13 at 13:04
  • I, uh, didn't consider that. It was still good to learn of `nanoTime`'s existence for me as it would be fairly more useful in scenarios where many large volumes of operations need to be timed or logged. – Lilienthal May 02 '13 at 13:22
  • 1
    @Uooo `currentTimeMillis()` is for "wall time", and `nanoTime()` is high resolution elapsed time. There is a slight difference in them, and their purpose. `nanoTime()` is not affected by local time settings, clock corrections and such, and the difference of a later to earlier call is guaranteed to never be negative (on the same VM, in the same power cycle). There is no such guarantee for `currentTimeMillis()`. Use `currentTimeMillis()` to answer "with current time settings, how much time passed since 1970 jan 1", not "how much more time passed since I last called this function" – FPGA warrior Apr 19 '17 at 10:32
15

like so:

(int)(milliseconds / 1000)
Stas Jaro
  • 4,747
  • 5
  • 31
  • 53
10

Java 8 now provides the most concise method to get current Unix Timestamp:

Instant.now().getEpochSecond();
Scadge
  • 9,380
  • 3
  • 30
  • 39
9

From your code it would appear that you are trying to measure how long a computation took (as opposed to trying to figure out what the current time is).

In that case, you need to call currentTimeMillis before and after the computation, take the difference, and divide the result by 1000 to convert milliseconds to seconds.

NPE
  • 486,780
  • 108
  • 951
  • 1,012
3

I have written the following code in my last assignment, it may help you:

// A method that converts the nano-seconds to Seconds-Minutes-Hours form
private static String formatTime(long nanoSeconds)
{
    int hours, minutes, remainder, totalSecondsNoFraction;
    double totalSeconds, seconds;


    // Calculating hours, minutes and seconds
    totalSeconds = (double) nanoSeconds / 1000000000.0;
    String s = Double.toString(totalSeconds);
    String [] arr = s.split("\\.");
    totalSecondsNoFraction = Integer.parseInt(arr[0]);
    hours = totalSecondsNoFraction / 3600;
    remainder = totalSecondsNoFraction % 3600;
    minutes = remainder / 60;
    seconds = remainder % 60;
    if(arr[1].contains("E")) seconds = Double.parseDouble("." + arr[1]);
    else seconds += Double.parseDouble("." + arr[1]);


    // Formatting the string that conatins hours, minutes and seconds
    StringBuilder result = new StringBuilder(".");
    String sep = "", nextSep = " and ";
    if(seconds > 0)
    {
        result.insert(0, " seconds").insert(0, seconds);
        sep = nextSep;
        nextSep = ", ";
    }
    if(minutes > 0)
    {
        if(minutes > 1) result.insert(0, sep).insert(0, " minutes").insert(0, minutes);
        else result.insert(0, sep).insert(0, " minute").insert(0, minutes);
        sep = nextSep;
        nextSep = ", ";
    }
    if(hours > 0)
    {
        if(hours > 1) result.insert(0, sep).insert(0, " hours").insert(0, hours);
        else result.insert(0, sep).insert(0, " hour").insert(0, hours);
    }
    return result.toString();
}

Just convert nano-seconds to milli-seconds.

Eng.Fouad
  • 115,165
  • 71
  • 313
  • 417
2
TimeUnit.SECONDS.convert(start6, TimeUnit.MILLISECONDS);
pramodc84
  • 1,576
  • 2
  • 25
  • 33
2

For conversion of milliseconds to seconds, since 1 second = 10³ milliseconds:

//here m will be in seconds
long m = System.currentTimeMillis()/1000;

//here m will be in minutes
long m = System.currentTimeMillis()/1000/60; //this will give in mins
Amir Raza
  • 2,320
  • 1
  • 23
  • 32
1
// Convert millis to seconds. This can be simplified a bit,
// but I left it in this form for clarity.
long m = System.currentTimeMillis(); // that's our input
int s = Math.max(
  .18 * (Math.toRadians(m)/Math.PI),
  Math.pow( Math.E, Math.log(m)-Math.log(1000) )
);
System.out.println( "seconds: "+s );
freeideas
  • 71
  • 5