爪哇军事时间的时差

时间:2014-01-16 05:06:48

标签: java time

因此,对于作业,我们必须编写一个程序,在军事时间内需要两次,并显示它们之间的小时和分钟的差异,假设第一次是两次中的较早时间。我们不被允许使用if语句,因为它在技术上尚未学习。这是一个看起来像运行的例子。在引号中,我会在提示时输入手动输入的内容。

java MilitaryTime

Please enter first time:  "0900"

Please enter second time:  "1730"

8 hours 30 minutes    (this is the final answer)

我能够使用以下代码轻松完成此部分:

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 "  );
       }
}

现在我的问题是没有分配的东西(或者我不会在这里!)这本书中的另一个问题就是说我们刚刚写的这个程序并且处理了第一次的情况比第二个晚。这真的让我对如何做到这一点感到好奇,并且真的让我很难过。同样,我们不允许使用if语句,或者这很容易,我们基本上可以使用所有数学函数。

一个例子是第一次现在是1730,第二次是0900,现在它返回15小时30分钟。

9 个答案:

答案 0 :(得分:4)

我建议使用org.joda.time.DateTime。有很多日期和时间功能。

示例:

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");

您的预期计划如下:

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");

输出:

8 hours 30 minutes

答案 1 :(得分:2)

通常情况下,在处理这种性质的时间计算时,我会使用Joda-Time,但假设您不关心日期组件而且没有滚动日期边界,您可以简单地将值转换为分钟或者从午夜开始的几秒钟......

基本上你遇到的问题是一小时内有60分钟的简单事实,这使得简单的数学不可能,你需要更常见的东西

例如,0130实际上是从午夜开始的90分钟,1730是从午夜开始的1050分钟,这使得它有16个小时的差异。您可以简单地减去这两个值来获得差异,然后将其转换回小时和分钟......例如......

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;
    }

}

一旦开始包含日期组件或滚动日期边界,请获取Joda-Time out

答案 2 :(得分:1)

我会做类似的事情:

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

绝对值会给出两次正整数之间的差异。

答案 3 :(得分:1)

你可以做这样的事情

//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

还有很多其他方法,但这是我在学习时用于类似问题的方法。另外,请注意我更改了变量名称以遵循java命名约定 - 变量是lowerCamelCase。

答案 4 :(得分:1)

我使用了3个班级。让我们首先讨论理论。

我们有两次:A和B.

  • 如果AtimeDiff =(B-A).....可以写成-(A-B)
  • 如果A> B,则timeDiff = 1440- (A-B) [1440是一天中的总分钟数]

因此,我们需要制作timeDiff = 1440 - (A-B),我们需要在A时使1440一词消失

让我们做一个术语X = (A-B+1440) / 1440(注意“/”是整数除法。

  • '如果A
  • '如果A> B,则X = 1;

现在看一个新术语Y = 1440 * X

  • '如果A
  • '如果A> B,则Y = 1440'。

问题已解决。现在只需插入Java程序即可。注意如果A = B会发生什么。如果时间完全相同,我们的程序将假设我们知道没有时间过去。它假设已经过了24小时。无论如何,请查看下面列出的3个程序:

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;   
    }

类#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

}

类#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.");   
    }
}

答案 5 :(得分: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 ");

 }
}

答案 6 :(得分:0)

这个是在不使用ifs和date thingy的情况下完成的。你只需要使用整数除法&#34; /&#34;,整数余数&#34;%&#34;,以及绝对值和celing。也许可以简化,但我现在太懒了。我挣扎了好几个小时才弄明白,似乎没有其他人在没有使用更多高级功能的情况下得到答案。这个问题出现在Cay Horstmann的Java书中。第4章Java 5-6版本的书&#34; Java Concepts&#34;

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");
    }
}

答案 7 :(得分:0)

java.time

Java 8及更高版本包含新的java.time框架。请参阅Tutorial

新类包括LocalTime,用于表示没有日期且没有时区的仅限时间的值。

另一个类是Duration,用于将时间跨度表示为总秒数和纳秒数。 Duration可以被视为若干小时和分钟。

默认情况下,Duration类实现toString方法,使用PnYnMnDTnHnMnS的{​​{1}}生成值的String表示形式,其中P标记开头,T将日期部分与时间部分分开。 Duration类可以解析以及以此标准格式生成字符串。

因此,下面的示例代码中的结果是PT8H30M,为期八个半小时。这种格式比08:30更明智,这种格式很容易混淆一段时间而不是持续时间。

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 );

转储到控制台。

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

跑步时。

  

从开始:09:00到停止:17:30 = PT8H30M

答案 8 :(得分:-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");
    }
}