Java中的军事时差

时间:2018-10-11 18:32:09

标签: java

这是我的TimeInterval类:

public class TimeInterval {

   private int fTime;
   private int sTime;

   public TimeInterval(int fTime, int sTime) {
      if(fTime < 0 || fTime > 2400 || sTime < 0 || sTime > 2400) {
          System.out.println("Illegal times, must be < 2400 and > 0)");
          System.exit(0);
      } else {
          this.fTime = fTime;
          this.sTime = sTime;
      }
   }

   public int getHours() {
      return Math.abs((fTime - sTime) / 100);
   }

   public int getMinutes() {
       return Math.abs((fTime - sTime) % 100);
   }

   public double getDecimalTime() {
      return getHours() + ((double) getMinutes() / 60);
   }
}

和我的测试人员课程:

import java.util.*;

public class TestTimeInterval {

   public static void main(String[] args) {

      Scanner s = new Scanner(System.in);
      System.out.print("Please enter the first time: ");
      int fTime = s.nextInt();
      System.out.print("Please enter the second time: ");
      int sTime = s.nextInt();

      TimeInterval t = new TimeInterval(fTime, sTime);

      System.out.printf("%s: %2d hours %2d minutes \n", "Elapsed time in hrs/min ", t.getHours(), t.getMinutes());
      System.out.printf("%s: %.2f", "Elapsed time in decimal", t.getDecimalTime());

   }    
}

但是,它可以正确计算某些时间,但是如果我输入例如0150和0240,则相差应该是50分钟,但显示90,我需要使其不超过60,并将余数转换为小时和分钟。如果我输入其他数字,它会起作用。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:15)

tl; dr

Duration
.between(
    LocalTime.parse( "0150" , DateTimeFormatter.ofPattern( "HHmm" ) ) ,
    LocalTime.parse( "0240" , DateTimeFormatter.ofPattern( "HHmm" ) ) 
)
.toString()
  

PT50M

详细信息

也许您只是在做家庭作业。如果是这样,请在您的问题中明确说明。

但是您应该知道Java为此提供了类。

java.time

现代方法使用 java.time 类。这些课程默认为24小时制。

LocalTime

对于一天中没有日期和时区的时间,请使用LocalTime

    LocalTime start = LocalTime.of( 1 , 50 );
    LocalTime stop = LocalTime.of( 2 , 40 );

Duration

将经过时间计算为Duration

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

生成表示该Duration值的文本。默认情况下,使用standard ISO 8601 format

    System.out.println( d );
  

PT50M

零件

如果需要,您可以提取零件。

int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;

解析

要解析用户提供的HHMM格式,请使用DateTimeFormatter

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HHmm" ) ;
LocalTime lt = LocalTime.parse( "0150" , f ) ;

区域

请注意,仅在不包含日期和时区的情况下使用一天中的时间可能会导致错误的结果。如果使用UTC,则没问题。但是,如果您的日时值实际上旨在表示特定区域的壁钟时间,那么仅使用LocalTime就可以忽略诸如夏时制(DST)之类的异常。在您的示例中,如果在美国的DST转换日期发生,可能没有两点钟或已经重复两点钟。

如果您隐式地打算使用时区,请通过应用ZoneId来获得ZonedDateTime对象来明确显示该时区。

LocalDate ld = LocalDate.of( 2018 , 1 , 23 ) ;
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z );
…
Duration d = Duration.between( zdt , laterZdt ) ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:3)

因此,要弄清两个24小时之间的经过时间,您需要转换为总分钟数,因为您正在使用的模函数将无法工作,因为1小时= 60分钟而不是100分钟。

因此,首先将所有小时/分钟转换为分钟时间。

int ftminuets = 0;
int stminuets = 0;
int totalmin = 0;
int elapsed = = 0
while(fTime >= 100)
{
     ftminuets += 60;
     fTime -= 100;
}
ftminuets += fTime; //gets remaining minuets from fTime.

while(sTime >= 100)
{
    stminuets += 60;
    sTime -= 100;
}
stminuets += sTime;  //gets remaining minuets from sTime.

//time to subtract
totalmin = stminuets - ftminuets;
//now total min has the total minuets in what can be considered to be 60 min increments.  Now just to switch it back into a 24 hours time.

while(totalmin >= 60)
{
    elapsed += 100;
    totalmin -= 60;
}
elapsed += totalmin; //get rest of the minuets.

经过时间现在应具有24小时的经过时间。

答案 2 :(得分:3)

我已经回答了我自己的问题,解决的方法是我将小时数与分钟数部分分开(例如1159、11和59 ),再乘以小时数,然后将其加到其余的分钟。

int array[] = {1, 5, 1, 9, 2, 7, 1, 3}

然后,在this.fTimeInMin = ((fTime / 100) * 60) + (fTime % 100); this.sTimeInMin = ((sTime / 100) * 60) + (sTime % 100); getHours()方法中,将分钟转换为小时和分钟

getMinutes()

答案 3 :(得分:2)

好吧,这就是您要寻找的解决方案。划分mil.time,以便您可以分别获得小时和分钟,然后剩下的就是算盘了。您唯一可以接受这两个参数作为字符串的东西。

public class TimeInterval {
    private String fTime;
    private String sTime;
    private static int timeDiffMinutes;

    public static void main(String[] args) {
        String fTime = "0330";
        String sTime = "1330";
        TimeInterval t = new TimeInterval(fTime, sTime);

        System.out.println("timeDiff  " + getTimeDiffMinutes());

        System.out.println(t.getHours() + "...." + t.getMinutes());
        System.out.println(t.getDecimalTime());

    }

    public TimeInterval(String fTime, String sTime) {
        int fTimeInt = Integer.valueOf(fTime);
        int sTimeInt = Integer.valueOf(sTime);

        if (fTimeInt < 0 || fTimeInt > 2400 || sTimeInt < 0 || sTimeInt > 2400) {
            System.out.println("Illegal times, must be < 2400 and > 0)");
            System.exit(0);
        } else {
            this.fTime = fTime;
            this.sTime = sTime;
            getTimeDiff();
        }
    }

    public static int getTimeDiffMinutes() {
        return timeDiffMinutes;
    }

    public int getHours() {
        return Math.abs(timeDiffMinutes / 60);
    }

    public int getMinutes() {
        return Math.abs(timeDiffMinutes);
    }

    public double getDecimalTime() {
        return getHours() + ((double) getMinutes() / 60);
    }

    public void getTimeDiff() {
        final int mid1 = fTime.length() / 2; //get the middle of the String
        String[] parts = {fTime.substring(0, mid1), fTime.substring(mid1)};
        String fPart = parts[0];

        final int mid = sTime.length() / 2; //get the middle of the String
        String[] sParts = {sTime.substring(0, mid), sTime.substring(mid)};
        String sPart = sParts[0];

        int toBeExcluded = (Integer.valueOf(sPart) - Integer.valueOf(fPart)) * 40;
        this.timeDiffMinutes = (Integer.valueOf(sTime) - Integer.valueOf(fTime)) - toBeExcluded;
    }
}

答案 4 :(得分:0)

您如何检查错误的无效输入?没必要吗?如果可以,即使您当前只需要少于30次操作,您的方法也会增长到多2个操作,这不包括0000小时或2400小时的问题。