Reputation: 253
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
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.
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
Use the ThreeTen BackPort, no, seriously, get the java.time
APIs in earlier versions of Java
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
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
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
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
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
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
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