0

So for an assignment we had to write a program that takes two times in military time and shows the difference in hours and minutes between them assuming the first time is the earlier of the two times. We weren't allowed to use if statements as it technically has not be learned. Here's an example of what it'd look like run. In quotes I'll put what is manually entered when it is prompted to.

java MilitaryTime

Please enter first time:  "0900"

Please enter second time:  "1730"

8 hours 30 minutes    (this is the final answer)

I was able to quite easily get this part done with the following code:

class MilitaryTime  {

   public static void main(String [] args) {

      Scanner in = new Scanner(System.in);

            System.out.println("Please enter the first time: ");

            int FirstTime = in.nextInt();

            System.out.println("Please enter the second time: ");

            int SecondTime = in.nextInt();

            int FirstHour = FirstTime / 100;

            int FirstMinute = FirstTime % 100;

            int SecondHour = SecondTime / 100;

            int SecondMinute = SecondTime % 100;

            System.out.println( ( SecondHour - FirstHour ) + " hours " + ( SecondMinute 

                - FirstMinute ) + " minutes "  );
       }
}

Now my question is something wasn't assigned (or I wouldn't be here!) is there's another part to this question in the book that says to take that program we just wrote and deal with the case where the first time is later than the second. This has really intrigued me about how this would be done and has really stumped me. Again we aren't allowed to use if statements or this would be easy we basically have all the mathematical functions to work with.

An example would be the first time is now 1730 and the second time is 0900 and so now it returns 15 hours 30 minutes.

Nathan Curtis
  • 57
  • 1
  • 1
  • 8
  • Convert the values to some known quantifiable metric, like minutes or seconds. Subtract the two values and then convert them back... – MadProgrammer Jan 16 '14 at 05:08
  • 1
    possible duplicate of [How to convert milliseconds to "hh:mm:ss" format?](http://stackoverflow.com/questions/9027317/how-to-convert-milliseconds-to-hhmmss-format). You could modify that accepted answer to your format using only a small change – Bohemian Jan 16 '14 at 05:11
  • Implement base-60 arithmetic. – Mark Jan 16 '14 at 05:11
  • Are you aware that this does not work for input values where the minutes of the first time are more than the minutes of the second time? e.g. `0930 and 1700` yields `8 hours -30 minutes` – Ron Jan 16 '14 at 06:56
  • Yes thank you for pointing this out I originally had absolute values in there then took them out not thinking they were necessary, figured that out and put them back in, thanks for this as well! – Nathan Curtis Jan 17 '14 at 04:31
  • By the way, this format is known by most people simply as [24-hour clock](https://en.wikipedia.org/wiki/24-hour_clock). Only in the United States and a few other places is the term "military time" used. – Basil Bourque Oct 26 '15 at 06:30

9 Answers9

4

I would like to suggest to use org.joda.time.DateTime. There are a lot of date and time functions.

Example :

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm");
Date startDate = format.parse("10-05-2013 09:00");
Date endDate = format.parse("11-05-2013 17:30");

DateTime jdStartDate = new DateTime(startDate);
DateTime jdEndDate = new DateTime(endDate);

int years = Years.yearsBetween(jdStartDate, jdEndDate).getYears();
int days = Days.daysBetween(jdStartDate, jdEndDate).getDays();
int months =  Months.monthsBetween(jdStartDate, jdEndDate).getMonths();
int hours = Hours.hoursBetween(jdStartDate, jdEndDate).getHours();
int minutes = Minutes.minutesBetween(jdStartDate, jdEndDate).getMinutes();

System.out.println(hours + " hours " + minutes + " minutes");

Your expected program will be as below :

SimpleDateFormat format = new SimpleDateFormat("hhmm");
Dates tartDate = format.parse("0900");
Date endDate = format.parse("1730");
DateTime jdStartDate = new DateTime(startDate);
DateTime jdEndDate = new DateTime(endDate);
int hours = Hours.hoursBetween(jdStartDate, jdEndDate).getHours();
int minutes = Minutes.minutesBetween(jdStartDate, jdEndDate).getMinutes();
minutes = minutes % 60;

System.out.println(hours + " hours " + minutes + " minutes");

Output :

8 hours 30 minutes
Zaw Than oo
  • 9,651
  • 13
  • 83
  • 131
  • Didn't know the DateTime existed, once again brand new to this. This actually makes a lot of sense. Thank you for this! – Nathan Curtis Jan 16 '14 at 05:29
  • 1
    Using an external library? I'm not sure if this satisfies the requirements for simplicity implied by the disallowing of if-statements because "it technically has not be learned" @NathanCurtis – Ron Jan 16 '14 at 07:12
3

Normally, when dealing with time calculations of this nature I would use Joda-Time, but assuming that you don't care about the date component and aren't rolling over the day boundaries, you could simply convert the value to minutes or seconds since midnight...

Basically the problem you have is the simple fact that there are 60 minutes in an hour, this makes doing simple mathematics impossible, you need something which is more common

For example, 0130 is actually 90 minutes since midnight, 1730 is 1050 minutes since midnight, which makes it 16 hours in difference. You can simply subtract the two values to get the difference, then convert that back to hours and minutes...for example...

public class MilTimeDif {

    public static void main(String[] args) {
        int startTime = 130;
        int endTime = 1730;
        int startMinutes = minutesSinceMidnight(startTime);
        int endMinutes = minutesSinceMidnight(endTime);

        System.out.println(startTime + " (" + startMinutes + ")");
        System.out.println(endTime + " (" + endMinutes + ")");

        int dif = endMinutes - startMinutes;

        int hour = dif / 60;
        int min = dif % 60;

        System.out.println(hour + ":" + min);

    }

    public static int minutesSinceMidnight(int milTime) {
        double time = milTime / 100d;

        int hours = (int) Math.floor(time);
        int minutes = milTime % 100;

        System.out.println(hours + ":" + minutes);

        return (hours * 60) + minutes;
    }

}

Once you start including the date component or rolling over day boundaries, get Joda-Time out

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
1

I would do something like:

System.out.println(Math.abs( SecondHour - FirstHour ) + " hours " + Math.abs( SecondMinute - FirstMinute ) + " minutes "  );

The absolute value will give you the difference between the two times as a positive integer.

Jeremy Bader
  • 382
  • 1
  • 6
  • 14
  • This is what I tried at first as well, but that will give the difference between 1730 and 0900 as 8 hours 30 minutes again (but positive this time at least!) instead of the 15 hours 30 minutes! – Nathan Curtis Jan 16 '14 at 05:27
  • 1
    Oh haha sorry, I thought that's what you wanted :) If you want 15:30, perhaps you could try this: `System.out.println( ( ( SecondHour - FirstHour + 24 ) % 24 ) + " hours " + ( SecondMinute - FirstMinute ) + " minutes " );` Using modulo remainder, I think this should work, if you want to give it a try. – Jeremy Bader Jan 16 '14 at 05:33
1

You could do something like this

//Code like you already have
System.out.println("Please enter the first time: ");
int firstTime = in.nextInt();
System.out.println("Please enter the second time: ");
int secondTime = in.nextInt();

//Now we can continue using the code you already wrote by
//forcing the smaller of the two times into the 'firstTime' variable.
//This forces the problem to be the same situation as you had to start with
if (secondTime < firstTime) {
    int temp = firstTime;
    firstTime = secondTime;
    secondTime = temp;
}

//Continue what you already wrote

There are many other ways but this was something I used for similar problems while learning. Also, note that I changed variable names to follow java naming conventions - variables are lowerCamelCase.

takendarkk
  • 3,347
  • 8
  • 25
  • 37
  • Thanks for the style note there, I'm brand new to java still getting the gist of how everything should be, that's the way I wrote it using the if statement playing around with it but was trying to find a way to do it without the if statement. Thank you anyway! – Nathan Curtis Jan 16 '14 at 05:28
  • No problem. The naming convention doesn't hurt anything, but you don't want to learn any bad habits! – takendarkk Jan 16 '14 at 05:30
1

I used 3 classes. Lets go over theory first.

We have two times: A and B.

  • if AtimeDiff = (B-A).....which can be written -(A-B)
  • if A>B, then timeDiff = 1440- (A-B) [1440 is total minutes in day]

Thus we need to make timeDiff = 1440 - (A-B) and we need to make 1440 term dissapear when A

Lets make a term X = (A-B+1440) / 1440 (notice "/" is integer division.

  • 'if A
  • 'if A>B then X = 1;

Now look at a new term Y = 1440 * X.

  • 'if A
  • 'if A>B then Y = 1440'.

PROBLEM SOLVED. Now just plug into Java Programs. Note what happens if A=B. Our program will assume we know no time passes if times are exact same time. It assumes that 24 hours have passed. Anyways check out the 3 programs listed below:

Class #1

    public class MilitaryTime {
    /**
     * MilitaryTime A time has a certain number of minutes passed at 
     *              certain time of day.
     * @param milTime The time in military format
    */
    public MilitaryTime(String milTime){
        int hours = Integer.parseInt(milTime.substring(0,2));
        int minutes = Integer.parseInt(milTime.substring(2,4));
        timeTotalMinutes = hours * 60 + minutes;

    }
    /**
     * Gets total minutes of a Military Time
     * @return gets total minutes in day at certain time
     */
    public int getMinutes(){
        return timeTotalMinutes;
    }

    private int timeTotalMinutes;   
    }

Class#2

 public class TimeInterval {

/**
  A Time Interval is amount of time that has passed between two times
  @param timeA first time
  @param timeB second time
*/
public TimeInterval(MilitaryTime timeA, MilitaryTime timeB){

    // A will be shorthand for timeA and B for timeB
    // Notice if A<B timeDifferential = TOTAL_MINUTES_IN_DAY - (A - B)
    // Notice if A>B timeDifferential = - (A - B)
    // Both will use timeDifferential = TOTAL_MINUTES_IN_DAY - (A - B),
    //  but we need to make TOTAL_MINUTES_IN_DAY dissapear when needed


    //Notice A<B following term "x" is 1 and if A>B then it is 0.
    int x = (timeA.getMinutes()-timeB.getMinutes()+TOTAL_MINUTES_IN_DAY)
             /TOTAL_MINUTES_IN_DAY;
    // Notice if A<B then  term "y" is TOTAL_MINUTES_IN_DAY(1440 min) 
    // and if A<B it is 0
    int y = TOTAL_MINUTES_IN_DAY * x;
    //yay our TOTAL_MINUTES_IN_DAY dissapears when needed.

    int timeDifferential = y - (timeA.getMinutes() - timeB.getMinutes());
    hours = timeDifferential / 60;
    minutes = timeDifferential % 60;

    //Notice that if both hours are equal, 24 hours will be shown.
    //  I assumed that we would knoe if something start at same time it
    //   would be "0" hours passed

}
/**
 * Gets hours passed between 2 times
 * @return hours of time difference 
 */
public int getHours(){
    return hours;
}

/**
 * Gets minutes passed after hours accounted for
 * @return minutes remainder left after hours accounted for
 */ 
public int getMinutes(){
    return minutes;
}

private int hours;
private int minutes;
public static final int TOTAL_MINUTES_IN_DAY = 1440;//60minutes in 24 hours

}

Class#3

import java.util.Scanner;

public class MilitaryTimeTester {
    public static void main (String[] args){

        Scanner in = new Scanner(System.in);

        System.out.println("Enter time A: ");
        MilitaryTime timeA = new MilitaryTime(in.nextLine());

        System.out.println("Enter time B: ");
        MilitaryTime timeB = new MilitaryTime(in.nextLine());

        TimeInterval intFromA2B = new TimeInterval(timeA,timeB);

        System.out.println("Its been "+intFromA2B.getHours()+" hours and "+intFromA2B.getMinutes()+" minutes.");   
    }
}
0
import java.util.Scanner;

 public class TimeDifference{

  public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    // read first time
    System.out.println("Please enter the first time: ");
    int firstTime = in.nextInt();

    // read second time
    System.out.println("Please enter the second time: ");
    int secondTime = in.nextInt();

    in.close();

    // if first time is more than second time, then the second time is in
    // the next day ( + 24 hours)
    if (firstTime > secondTime)
        secondTime += 2400;

    // first hour & first minutes
    int firstHour = firstTime / 100;
    int firstMinute = firstTime % 100;

    // second hour & second minutes
    int secondHour = secondTime / 100;
    int secondMinute = secondTime % 100;

    // time difference
    int hourDiff = secondHour - firstHour;
    int minutesDiff = secondMinute - firstMinute;

    // adjust negative minutes
    if (minutesDiff < 0) {
        minutesDiff += 60;
        hourDiff--;
    }

    // print out the result
    System.out.println(hourDiff + " hours " + minutesDiff + " minutes ");

 }
}
fymo
  • 36
  • 2
0

This one is done without using ifs and date thingy. you just need to use integer division "/", integer remainder thing"%", and absolute value and celing. might be able to be simplified but im too lazy at moment. I struggled for hours to figure out and seems nobody else got the answer without using more advanced functions. this problem was in Cay Horstmann's Java book. Chapter 4 in Java 5-6 version of the book "Java Concepts"

import java.util.Scanner;

public class MilitaryTime {

    public static void main (String[] args){

        //creates input object
        Scanner in = new Scanner(System.in);

        System.out.println("Enter time A: ");
        String timeA = in.next();

        System.out.println("Enter time B: ");
        String timeB = in.next();

        //Gets the hours and minutes of timeA
        int aHours = Integer.parseInt(timeA.substring(0,2));
        int aMinutes = Integer.parseInt(timeA.substring(2,4));

        //Gets the hours and minutes of timeB
        int bHours = Integer.parseInt(timeB.substring(0,2));
        int bMinutes = Integer.parseInt(timeB.substring(2,4));

        //calculates total minutes for each time
        int aTotalMinutes = aHours * 60 + aMinutes;
        int bTotalMinutes = bHours * 60 + bMinutes;


       //timeA>timeB: solution = (1440minutes - (aTotalMinutes - bTotalMinutes))
       //timeA<timeB: solution is (bTotalMinutes - aTotalMinutes) or   
       //-(aTotalMinutes - bTotalMinutes)
       //we need 1440 term when  timea>timeeB... we use mod and mod remainder

        //decider is 1 if timeA>timeB and 0 if opposite.
        int decider = ((aTotalMinutes - bTotalMinutes +1440)/1440);
        // used 4 Special case when times are equal. this way we get 0
        // timeDiffference term when equal and 1 otherwise.

        int equalsDecider = (int) Math.abs((aTotalMinutes - bTotalMinutes));

        //fullDayMaker is used to add the 1440 term when timeA>timeB
        int fullDayMaker = 1440 * decider;
        int timeDifference = (equalsDecider)* (fullDayMaker - (aTotalMinutes - bTotalMinutes));

        // I convert back to hours and minmutes using modulater
        System.out.println(timeDifference/60+" hours and "+timeDifference%60+" minutes");
    }
}
Pang
  • 9,564
  • 146
  • 81
  • 122
0

java.time

Java 8 and later includes the new java.time framework. See the Tutorial.

The new classes include LocalTime for representing a time-only value without date and without time zone.

Another class is Duration, for representing a span of time as a total number of seconds and nanoseconds. A Duration may be viewed as a number of hours and minutes.

By default the Duration class implements the toString method to generate a String representation of the value using the ISO 8601 format of PnYnMnDTnHnMnS where the P marks the beginning and the T separates the date portion from the time portion. The Duration class can parse as well as generate strings in this standard format.

So, the result in example code below is PT8H30M for eight and a half hours. This format is more sensible than 08:30 which can so easily be confused for a time rather than a duration.

String inputStart = "0900";
String inputStop = "1730";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HHmm" );;

LocalTime start = formatter.parse ( inputStart , LocalTime :: from );
LocalTime stop = formatter.parse ( inputStop , LocalTime :: from );

Duration duration = Duration.between ( start , stop );

Dump to console.

System.out.println ( "From start: " + start + " to stop: " + stop + " = " + duration );

When run.

From start: 09:00 to stop: 17:30 = PT8H30M

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
-1
import java.util.*;

class Time
{
    static Scanner in=new Scanner(System.in);
    public static void main(String[] args)
    {
        int time1,time2,totalTime;
        System.out.println("Enter the first time in military:");
        time1=in.nextInt();
        System.out.println("Enter the second time in military:");
        time2=in.nextInt();
        totalTime=time2-time1;
        String temp=Integer.toString(totalTime);
        char hour=temp.charAt(0);
        String min=temp.substring(1,3);
        System.out.println(hour+" hours "+min+" minutes");
    }
}