TaylorTDHouse
TaylorTDHouse

Reputation: 253

How to get the time since midnight in seconds

First off, this is a simple question that I'm stuck on in my Java 1 class. It's a static time that I set already as 8:49:12 "today" and I'm to figure out how many seconds past midnight and "to" midnight this represents. 8 hours, 49 minutes, and 12 seconds. Here is my code now:

hour    = 8;
minute  = 59;
second  = 32;
System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);

My issue is that I have no clue on how to get the time from and since midnight.

So basically the output needs to be:

Number of seconds since midnight: 
Number of seconds to midnight:

And the space after is for the seconds.

Thanks, and please explain why, and how you chose how to solve this. I want to learn :P

Upvotes: 7

Views: 28073

Answers (7)

MadProgrammer
MadProgrammer

Reputation: 347334

Time maths is inherently inaccurate. There are lots of "rules" and "edge cases" which don't make it as simple as adding or multiplying seconds together. Instead, you should be making use of appropriate libraries which support these things.

Post Java 8

How time flies ... 😜

Make use of the java.time APIs, for example...

LocalDateTime before = LocalDateTime
        .now()
        .withHour(0)
        .withMinute(0)
        .withSecond(0)
        .withNano(0);
LocalDateTime after = before
        .now()
        .withHour(23)
        .withMinute(59)
        .withSecond(59)
        .withNano(999_999_999);

LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(before, now);

DateTimeFormatter formatter = DateTimeFormatter.ISO_TIME;

System.out.println("Seconds from midnight to "  + formatter.format(now) + " = " + Duration.between(before, now).toSeconds());
System.out.println("Seconds to midnight from "  + formatter.format(now) + " = " + Duration.between(now, after).toSeconds());

Which outputs...

Seconds from midnight to 09:55:21.308052 = 35721
Seconds to midnight from 09:55:21.308052 = 50678

Pre Java 8

Use the ThreeTen BackPort, no, seriously, get the java.time APIs in earlier versions of Java

JodaTime (I believe this is now in maintaince)

Or you could use JodaTime...

MutableDateTime now = MutableDateTime.now();
now.setMillisOfDay(0);
now.setSecondOfDay(32);
now.setMinuteOfDay(59);
now.setHourOfDay(8);
DateTime fromMidnight = now.toDateTime().toDateMidnight().toDateTime();
DateTime toMidnight = fromMidnight.plusDays(1);

Duration duration = new Duration(fromMidnight, toMidnight);

Duration dFromMidnight = new Duration(fromMidnight, now);
System.out.println("From midnight: " + dFromMidnight.getStandardSeconds());

Duration dToMidnight = new Duration(now, toMidnight);
System.out.println("To Midnight: " + dToMidnight.getStandardSeconds());

Which outputs...

From midnight: 32372
To Midnight: 54028

Calendar (don't do this)

Given the idiosyncrasies of time, you could simply use the Calendar API

Calendar fromMidnight = Calendar.getInstance();
fromMidnight.set(Calendar.HOUR, 0);
fromMidnight.set(Calendar.MINUTE, 0);
fromMidnight.set(Calendar.SECOND, 0);
fromMidnight.set(Calendar.MILLISECOND, 0);

Calendar toMidnight = Calendar.getInstance();
toMidnight.setTime(fromMidnight.getTime());
toMidnight.add(Calendar.DATE, 1);

System.out.println(fromMidnight.getTime());
System.out.println(toMidnight.getTime());

Calendar toFromTime = Calendar.getInstance();
toFromTime.set(Calendar.HOUR, 8);
toFromTime.set(Calendar.MINUTE, 59);
toFromTime.set(Calendar.SECOND, 32);
toFromTime.set(Calendar.MILLISECOND, 0);

long secondsFromMidnight = (toFromTime.getTimeInMillis() - fromMidnight.getTimeInMillis()) / 1000;
long secondsToMidnight = (toMidnight.getTimeInMillis() - toFromTime.getTimeInMillis()) / 1000;

System.out.println("from = " + secondsFromMidnight + "; to " + secondsToMidnight);

Which outputs...

from = 32372; to 54028

Upvotes: 4

Meno Hochschild
Meno Hochschild

Reputation: 44071

The accepted answer of @Vimal Bera is fine and completely sufficient due to the mathematical simplicity of the problem. But if you still prefer a "formalized" (supported by library) approach without doing "much" calculation then you could do this in Java-8:

LocalTime time = LocalTime.of(8, 59, 32);
System.out.println(
  "Seconds since midnight: " 
  + time.get(ChronoField.SECOND_OF_DAY)); // 32372
System.out.println(
  "Seconds to midnight: " 
  + (86400 - time.get(ChronoField.SECOND_OF_DAY))); // 54028

Upvotes: 3

Heisenberg
Heisenberg

Reputation: 3193

There is an enum in JAVA called TimeUnit that can convert time to any time unit like this:

        int hour    = 8;
        int minute  = 59;
        int second  = 32;
        System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);

        long secInMidnight = TimeUnit.HOURS.toSeconds(24);
        long timeInSeconds = (TimeUnit.HOURS.toSeconds(8) + TimeUnit.MINUTES.toSeconds(minute) + second);

        System.out.println("\nSince midnight: " + timeInSeconds + "\nUntil midnight: " + (secInMidnight - timeInSeconds) );

Upvotes: 4

smajlo
smajlo

Reputation: 972

import java.util.Calendar;

public class HelloWorld{

 public static void main(String []args){
    int hour    = 8;
    int minute  = 59;
    int second  = 32;
    System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);
    final Calendar currentTime = Calendar.getInstance();
    currentTime.set(2013,Calendar.SEPTEMBER,24,8,59,32);
    final Calendar midNight = Calendar.getInstance();
    midNight.clear();
    midNight.set(2013, Calendar.SEPTEMBER, 25);
    System.out.println(.001*(midNight.getTimeInMillis() - currentTime.getTimeInMillis()));
 }

}

Consider using Calendar and or try JodaTime library

http://www.joda.org/joda-time/

Upvotes: 0

angel_navarro
angel_navarro

Reputation: 1777

Your answer is in java.util.Calendar class. Please see get()/set() methods: http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html

Upvotes: 0

Vimal Bera
Vimal Bera

Reputation: 10497

Try this simple maths :

System.out.println("Number of seconds since midnight:" +(second + (minute*60) + (hour*3600)));
System.out.println("Number of seconds to midnight:" +((60-second) + ((60-1-minute)*60) + (24-1-hour)*3600));

Upvotes: 9

Gabriel Negut
Gabriel Negut

Reputation: 13960

final static int SEC_IN_MIN = 60;
final static int SEC_IN_HOUR = SEC_IN_MIN * 60;
int secFromMidnight = hour * SEC_IN_HOUR + minute * SEC_IN_MIN + second;
int secToMidnight = (24 * SEC_IN_HOUR) - secFromMidnight;

Upvotes: 3

Related Questions