7

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

rogerdpack
  • 62,887
  • 36
  • 269
  • 388
TaylorTDHouse
  • 243
  • 2
  • 4
  • 8
  • 4
    Sounds to me like you just want someone to do your work for you. Please show what you have tried so far. – Scott Helme Sep 24 '13 at 06:52
  • 1
    Possible duplicate of [How can I find the amount of seconds passed from the midnight with Java?](http://stackoverflow.com/questions/4389500/how-can-i-find-the-amount-of-seconds-passed-from-the-midnight-with-java) – Przemek Jan 13 '16 at 20:36

7 Answers7

9

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));
Vimal Bera
  • 10,346
  • 4
  • 25
  • 47
4

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
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
4

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) );
Heisenberg
  • 3,153
  • 3
  • 27
  • 55
3
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;
Gabriel Negut
  • 13,860
  • 4
  • 38
  • 45
3

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
Meno Hochschild
  • 42,708
  • 7
  • 104
  • 126
0

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

angel_navarro
  • 1,757
  • 10
  • 11
0
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/

smajlo
  • 972
  • 10
  • 21