Java вычисляет разницу во времени между регистрацией и выходом - PullRequest
0 голосов
/ 16 января 2019

Я хочу рассчитать разницу во времени час и минуту без , используя java dateformat

пользователь должен вводить как Часы в: 23:00 Время выхода: 01:00

Ожидаемый результат должен быть примерно таким: 2 часа 00 минут .

Но как их вычислить?

Scanner input = new Scanner(System.in);

    //Read data
    System.out.print("Clock In: ");
    String sTimeIn = input.nextLine();

    System.out.print("Clock Out: ");
    String sTimeOut = input.nextLine();

    // Process data
    String sHourIn = sTimeIn.substring(0, 2);
    String sMinuteIn = sTimeIn.substring(3, 5);
    String sHourOut = sTimeOut.substring(0, 2);
    String sMinuteOut = sTimeOut.substring(3, 5);

    int iHourIn = Integer.parseInt(sHourIn);
    int iMinuteIn = Integer.parseInt(sMinuteIn);
    int iHourOut = Integer.parseInt(sHourOut);
    int iMinuteOut = Integer.parseInt(sMinuteOut);

    int sumHour =
    int sumMinute = 

    //Display Output
    System.out.print(sumHour +"Hour "+ sumMinute + " Minute");

}

}

После того, как я рассмотрел все решения, которые вы дали. Вот что я отредактировал. Но я все еще нашел проблему, если Clock in 23:00 Clock Out: 01: 00 и вывод 22Hour(s) 0 Minute(s). Выход должен быть 02 Hour(s) 0 Minute(s).

System.out.println("*Your time format must be 00:00");
        System.out.print("Clock In: ");
        String getTimeIn = input.nextLine();

        System.out.print("Clock Out: ");
        String getTimeOut = input.nextLine();

        // Process data
        String sHourIn = getTimeIn.substring(0, 2);
        String sMinuteIn = getTimeIn.substring(3, 5);
        String sHourOut = getTimeOut.substring(0, 2);
        String sMinuteOut = getTimeOut.substring(3, 5);

        int sumHour = Integer.parseInt(sHourIn) - Integer.parseInt(sHourOut);
        int sumMinute = Integer.parseInt(sMinuteIn) - Integer.parseInt(sMinuteOut);

        if(sumHour < 0) {
            sumHour =-sumHour;
        }

        if(sumMinute < 0) {
            sumMinute =- sumMinute;
        }

        //Display Output
         System.out.print(sumHour +"Hour(s) "+ sumMinute + " Minute(s)");

Ответы [ 5 ]

0 голосов
/ 17 января 2019

Вот мое предлагаемое решение, включающее простую (не идеальную) проверку ввода, я поместил решение в метод, поэтому запрос пользователя на ввод не обрабатывается

public static void calcTime(String sTimeIn, String sTimeOut) {
    final String timePattern = "[0-2][0-9]:[0-5][0-9]";

    if (sTimeIn == null || sTimeOut == null || !sTimeIn.matches(timePattern) || !sTimeIn.matches(timePattern)) {
        throw new IllegalArgumentException();
    }

    String[] timeIn = sTimeIn.split(":");
    String[] timeOut = sTimeOut.split(":");

    int inMinutes = 60 * Integer.valueOf(timeIn[0]) + Integer.valueOf(timeIn[1]);
    int outMinutes = 60 * Integer.valueOf(timeOut[0]) + Integer.valueOf(timeOut[1]);

    int diff = 0;
    if (outMinutes > inMinutes) {
        diff = outMinutes - inMinutes;
    } else if (outMinutes < inMinutes) {
        diff = outMinutes + 24 * 60 - inMinutes;
    }

    System.out.printf("Time difference between %s and %s is %d hours and %d minutes\n", sTimeIn, sTimeOut, diff / 60, diff % 60);
}

Обновление
Вот решение на основе LocalTime и Duration

public static void calcTime2(String sTimeIn, String sTimeOut) {
    final String timePattern = "[0-2][0-9]:[0-5][0-9]";

    if (sTimeIn == null || sTimeOut == null || !sTimeIn.matches(timePattern) || !sTimeIn.matches(timePattern)) {
        throw new IllegalArgumentException();
    }

    String[] timeIn = sTimeIn.split(":");
    String[] timeOut = sTimeOut.split(":");

    LocalTime localTimeIn = LocalTime.of(Integer.valueOf(timeIn[0]), Integer.valueOf(timeIn[1]));
    LocalTime localTimeOut = LocalTime.of(Integer.valueOf(timeOut[0]), Integer.valueOf(timeOut[1]));

    Duration duration;
    if (localTimeOut.isAfter(localTimeIn)) {
        duration = Duration.between(localTimeIn, localTimeOut);
    } else {
        Duration prevDay = Duration.ofHours(24).minusHours(localTimeIn.getHour()).minusMinutes(localTimeIn.getMinute());
        Duration nextDay = Duration.between(LocalTime.MIDNIGHT, localTimeOut);
        duration = prevDay.plus(nextDay);
    }

    System.out.printf("Time difference between %s and %s is %d hours and %d minutes\n", sTimeIn, sTimeOut,
            duration.toHours(), duration.minusHours(duration.toHours()).toMinutes());     
}
0 голосов
/ 16 января 2019

Если вы хотите использовать LocalTime и ChronoUnit классы Java 8:

String sTimeIn = "23:15";
String sTimeOut = "1:30";
LocalTime timeIn = LocalTime.parse(sTimeIn, DateTimeFormatter.ofPattern("H:m"));
LocalTime timeOut = LocalTime.parse(sTimeOut, DateTimeFormatter.ofPattern("H:m"));
long dif = ChronoUnit.MINUTES.between(timeIn, timeOut);
if (dif < 0)
    dif += 24 * 60;
long sumHour = dif / 60;
long sumMinute = dif % 60;

System.out.println(sumHour + ":"+ sumMinute);

или в формате HH:mm:

System.out.println(String.format("%02d", sumHour) + ":"+ String.format("%02d", sumMinute));

напечатает:

02:15
0 голосов
/ 16 января 2019

попробуйте это:

public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
   //Read data
   System.out.println("Clock In: ");
   String sTimeIn = "20:30";

   System.out.println("Clock Out: ");
   String sTimeOut = "18:20";

   // Process data
   String sHourIn = sTimeIn.substring(0, 2);
   String sMinuteIn = sTimeIn.substring(3, 5);
   String sHourOut = sTimeOut.substring(0, 2);
   String sMinuteOut = sTimeOut.substring(3, 5);

   int iHourIn = Integer.parseInt(sHourIn);
   int iMinuteIn = Integer.parseInt(sMinuteIn);
   int iHourOut = Integer.parseInt(sHourOut);
   int iMinuteOut = Integer.parseInt(sMinuteOut);

   Calendar cal = Calendar.getInstance();

   cal.set(Calendar.HOUR_OF_DAY,iHourIn);
   cal.set(Calendar.MINUTE,iMinuteIn);
   cal.set(Calendar.SECOND,0);
   cal.set(Calendar.MILLISECOND,0);
   Long timeIn = cal.getTime().getTime();

   cal.set(Calendar.HOUR_OF_DAY,iHourOut);
   cal.set(Calendar.MINUTE,iMinuteOut);
   cal.set(Calendar.SECOND,0);
   cal.set(Calendar.MILLISECOND,0);
   Long timeOut = cal.getTime().getTime();

   Long finaltime=  timeIn-timeOut;

   // Convert the result to Hours and Minutes

   Long temp = null;
   // get hours
   temp = finaltime % 3600000 ;
   int sumHour = (int) ((finaltime - temp) / 3600000 );

   finaltime = temp;

   int sumMinute = (int) (finaltime/ 60000);

   //Display Output
   System.out.println(sumHour +" Hour "+ sumMinute + " Minute");
}   
0 голосов
/ 16 января 2019

Как @Stultuske сказал, что библиотека времени должна быть более безопасной, я привел пример ниже

import java.time.LocalTime;

public class HelloWorld
{
  public static void main(String[] args)
  {
      LocalTime in = LocalTime.parse("18:20");
      LocalTime out = LocalTime.parse("20:30");

      int hoursDiff = (out.getHour() - in.getHour()),
          minsDiff  = (int)Math.abs(out.getMinute() - in.getMinute()),
          secsDiff  = (int)Math.abs(out.getSecond() - in.getSecond());

      System.out.println(hoursDiff+":"+minsDiff+":"+secsDiff);
  }
}

Обновление:

В решении отсутствует пересечение полуночи, как указано @ Joakim Danielson , поэтому я изменил приведенное выше решение, чтобы проверить наличие in > out или out < in.

import java.time.LocalTime;

public class HelloWorld
{
  public static void main(String[] args)
  {
      LocalTime in = LocalTime.parse("16:00");
      LocalTime out = LocalTime.parse("01:00");

      int hOut = out.getHour(),
          hIn  = in.getHour();

      int hoursDiff = hOut < hIn ? 24 - hIn + hOut : hOut - hIn,
          minsDiff  = (int)Math.abs(out.getMinute() - in.getMinute()),
          secsDiff  = (int)Math.abs(out.getSecond() - in.getSecond());

      System.out.println(hoursDiff+":"+minsDiff+":"+secsDiff);
  }
}
0 голосов
/ 16 января 2019

Я добавил код в дополнение к вашему коду.Пожалуйста, проверьте и дайте мне знать, если этого достаточно для вашего требования

public class MainClass1 {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    //Read data
    System.out.print("Clock In: ");
    String[] sTimeIn = input.nextLine().split(":");

    System.out.print("Clock Out: ");
    String[] sTimeOut = input.nextLine().split(":");

    int iHourIn = Integer.parseInt(sTimeIn[0]);
    int iMinuteIn = Integer.parseInt(sTimeIn[1]);
    int iHourOut = Integer.parseInt(sTimeOut[0]);
    int iMinuteOut = Integer.parseInt(sTimeOut[1]);

    if(iMinuteIn < iMinuteOut) {
        iMinuteIn = 60 + iMinuteIn;
        iHourIn--;
    }
    int sumHour = iHourIn - iHourOut;
    int sumMinute = iMinuteIn - iMinuteOut;

            //Display Output
            System.out.print(sumHour +"Hour "+ sumMinute + " Minute");


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...