Java中的军事时差

dyn*_*tem 8 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

和我的测试人员班:

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

   }    
}
Run Code Online (Sandbox Code Playgroud)

但是,它正确地计算了一定的时间,但是如果我输入例如0150和0240,差异应该是50分钟,而是显示90,我需要使它不超过60,并将剩余部分转换为小时和分钟.如果我输入其他一些数字,它就可以了.任何帮助表示赞赏.

Bas*_*que 15

TL;博士

Duration
.between(
    LocalTime.parse( "0150" , DateTimeFormatter.ofPattern( "HHmm" ) ) ,
    LocalTime.parse( "0240" , DateTimeFormatter.ofPattern( "HHmm" ) ) 
)
.toString()
Run Code Online (Sandbox Code Playgroud)

PT50M

细节

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

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

java.time

现代方法使用java.time类.默认情况下,这些类以24小时制运行.

LocalTime

对于没有日期且没有时区的时间,请使用LocalTime.

    LocalTime start = LocalTime.of( 1 , 50 );
    LocalTime stop = LocalTime.of( 2 , 40 );
Run Code Online (Sandbox Code Playgroud)

Duration

将经过的时间计算为Duration.

    Duration d = Duration.between( start , stop );
Run Code Online (Sandbox Code Playgroud)

生成表示该Duration值的文本.默认情况下,使用标准ISO 8601格式.

    System.out.println( d );
Run Code Online (Sandbox Code Playgroud)

PT50M

部分

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

int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
Run Code Online (Sandbox Code Playgroud)

解析

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

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HHmm" ) ;
LocalTime lt = LocalTime.parse( "0150" , f ) ;
Run Code Online (Sandbox Code Playgroud)

请注意,仅在没有日期和时区背景的情况下处理时间可能会导致错误的结果.如果在UTC工作,没问题.但是,如果您的时间值实际上是为了表示特定区域的挂钟时间,那么LocalTime仅使用夏令时(DST)等异常将被忽略.在你的例子中,如果在美国的DST切换日期发生,可能没有两点钟,或者两点钟已经重复.

如果您隐含意图使用时区,请通过应用a 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 ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


dyn*_*tem 3

我已经回答了我自己的问题,解决方案是我将小时与分钟部分分开(例如 1159 到 11 和 59),将小时相乘以获得分钟并将其添加到其余分钟中。

this.fTimeInMin = ((fTime / 100) * 60) + (fTime % 100);
this.sTimeInMin = ((sTime / 100) * 60) + (sTime % 100);
Run Code Online (Sandbox Code Playgroud)

然后,在getHours()andgetMinutes()方法中将分钟转换为小时和分钟

public int getHours() {
    return Math.abs((this.fTimeInMin - this.sTimeInMin) / 60);
}

public int getMinutes() {
    return Math.abs((this.fTimeInMin - this.sTimeInMin) % 60);
}
Run Code Online (Sandbox Code Playgroud)