Сравнивать часы в Java

Я изучаю Java и пробую делать программу, которая контролировала бы часы рабочего дня. Идея: я прошу его пользователя час начала (HH:mm) (Вашей работы например) и час конец (HH:mm). Я это сохраняю, чтобы мочь действовать с этим после. (я не знаю очень хорошо, как просить час пользователя, не делая этого как String, так как, если я это делаю как String может процеживать мне любую вещь. Он должен делать какую-то API, чтобы мочь работать с часами, а именно сравнивать, суммировать, оставаться... Я видел Я датировал ее и я не становлюсь понятным...

То, что я нуждаюсь в том, чтобы подтвердить, состоит в том, что час конец меньше час начало не превосходит 15 часов, а именно Ваш день, не должно быть превышающим эти 15 часов. (Я это не знаю, как делание этого.). После я нуждаюсь в том, чтобы достать блоки или периоды между этими часами и действовать с часами, отделить, группировать... Только мне интересно работать с часами и минутами, мне не надо в день, ни месяц ни год. Он для дня одного дня. Это - то, что у меня есть пока: Посмотрим кто-то может бросать мне кабель porfa.:)

public static void main(String[] args) throws IOException {
    // TODO code application logic here
    try {
        Scanner in = new Scanner(System.in); // Creamos un objeto de la clase Scanner
        System.out.println("Introduzca la hora de inicio: (hh:mm)");
        LocalTime start = LocalTime.parse(in.next());
        System.out.println("Introduzca la hora de finalización: (hh:mm)");
        LocalTime end = LocalTime.parse(in.next());

        int minutes = (int) ChronoUnit.MINUTES.between(start, end);

        System.out.println("------------------------------");
        if (minutes > (60 * 15)) {//sobrelímite de jornada:
            System.out.println("Límte de jornada!");
            System.out.println("Sobrepasa las 15 horas!!!");
            System.in.read();
        } else {//jornada correcta:
            System.out.println("Límite de 15 horas en la jornada: OK");
            System.out.println("rango de minutos: " + minutes);
            //más cosas..
            //mostramos horas de trabajo total:
            int workhours = minutes / 60;//pasar a horas los minutos trabajados(para mostrarlas)
            if (minutes <= 60 && minutes > 0) {
                System.out.println("Horas de trabajo: " + workhours + " hora.");
                System.out.println("\nPosible trabajo:");
                System.out.println("1 hora de conducción.");
                System.in.read();
            } else {
                if (minutes < 0) {
                    minutes += 60 * 24;
                }
                System.out.println("Horas de trabajo: " + workhours + " horas.");
                //mostramos los periodos:

                if (minutes > 45 && minutes <= 315) {//
                    System.out.println("\nPosible trabajo:");
                    System.out.println("Salida a las " + start + "h,");
                    System.out.println("4:30h de conducción,");
                    System.out.println("1 descanso de 45 min,");
                    System.out.println("fin de trabajo a las " + end + ".");
                    System.in.read();
                }
                if (minutes > 315 && minutes <= 630) {
                    System.out.println("\nPosible trabajo:");
                    System.out.println("Salida a las " + start + "h,");
                    System.out.println("4:30h de conducción,");
                    System.out.println("1 descanso de 45 min,");
                    System.out.println("4:30h de conducción,");
                    System.out.println("1 descanso de 45 min.");
                    System.in.read();
                }
                if (minutes > 630 /*&& minutes<=690*/) {
                    System.out.println("\nPosible trabajo:");
                    System.out.println("Salida a las " + start + "h,");
                    System.out.println("4:30h de conducción,");
                    System.out.println("1 descanso de 45 min,");
                    System.out.println("4:30h de conducción,");
                    System.out.println("1 descanso de 45 min,");
                    System.out.println("60 minutos de conducción.");
                    System.out.println("Alcanzado el límite de 9h de conducción.");
                    System.in.read();
                }
            }
        }
    } catch (DateTimeParseException e) {
        System.out.println("Horas de inicio/fin no válidas!");
        System.in.read();
    }
}
3
задан 12.06.2016, 12:40
3 ответа

Попроси час как String и чтобы санкционировать ее только, пробуй parsearla. Для этого, используй LocalTime который он сохраняет часы только (с или без вторых секунд / старших братьев).

    LocalTime entrada = null;
    LocalTime salida = null;    

    System.out.print("Hora de ingreso: ");
    String strIngreso = kb.next();
    System.out.print("\nHora de salida: ");
    String strSalida = kb.next();
    try {
       ingreso = LocalTime.parse(strIngreso);
       salida = LocalTime.parse(strSalida);
       // otra lógica
    } catch(DateTimeParseException e) {
       // la hora de entrada o salida es inválida,
       // informar al usuario y volver a pedirla
       pedirHoras();
    }

Чтобы подтверждать время между двумя часами, посредством ChronoUnit получи различие в минуты между обоими часами (объекты LocalTime) и ты сравниваешь ее с 60 * 15 что закончили бы тем, что были бы минутами, эквивалентными 15 часам:

    int minutes = (int) ChronoUnit.MINUTES.between(ingreso, salida);

    if(minutes > (15 * 60)) {
        // alerta, ¡estás explotando a tus empleados!
    }

Более реальный пример:

import java.util.*;
import java.time.*;
import java.time.temporal.*;
import java.time.format.*;

public class Demo {

    public static void main(String[] args) {
        try (Scanner kb = new Scanner(System.in)) {
            System.out.print("Ingrese la fecha de ingreso: ");
            LocalTime ingreso = LocalTime.parse(kb.next());
            System.out.print("Ingrese la fecha de salida: ");
            LocalTime salida  = LocalTime.parse(kb.next());

            int minutes = (int) ChronoUnit.MINUTES.between(ingreso, salida);
            if(minutes > (60 * 15)) {
                System.out.println("¡Estás explotando a tus empleados!");
            }
        } catch(DateTimeParseException e) {
            System.out.println("Fecha de ingreso o salida inválida");
        }
    }
}

Выход:

Ingrese la fecha de ingreso: 08:00
Ingrese la fecha de salida: 23:01
¡Estás explotando a tus empleados!
3
ответ дан 24.11.2019, 14:10
  • 1
    Твой код неправильный, потому что он не принимает во внимание минуты, и потому что он не принимает во внимание расписания, которые пересекают полночь. Кроме того, parser принял бы поступающие данные с не ожидаемыми форматами (секунды, десятичные точки для fracccion секунд) – leonbloy 11.06.2016, 22:26
  • 2
    Спасибо за твой ответ. Тогда ничто из API calendar, Я даже не Датировал ни другую, во что я верю, что hab и # 237; в, нет? Дело в том, что я искал и читал и увидел столько вещей, что уже не sab и # 237; ни в то, что quer и # 237; чтобы делать. Я иду посмотрим продолжаю твой пример, хотя потом я должен делать периоды... Другая вещь, когда делать import java.time.* и #191; потому что потом ты делаешь другими два? и #191; не предполагается, что из-за jerarqu и # 237; чтобы уже быть и # 237; an импортируемые? Извините меня, но я новый и приношу мыслительное действие концепций и вещей с языком " что pa que" – Erikiu 12.06.2016, 00:47
  • 3
    Нет. Синтаксис import paquete.* импортирует только классы внутри вышеупомянутого пакета. Он не импортирует субпакеты. В действительности не осложнено не использовать ни эту API ни другие, которые у тебя есть в disposici и # 243; n, только он cuesti и # 243; n l и # 243; gica. Ты не тревожишься много, прочитай вещь одновременно, что, если не, потом ты запутываешься и расстраиваешь. – gugadev 12.06.2016, 00:56
  • 4
    Ты упорядочил первый problea, что ты и # 241; в и # 233; но не второй. Пример: пользователь входит в 21:00 и выходит в 3:00 – leonbloy 12.06.2016, 04:33
  • 5
    S и # 237; верно, когда я помещаю этот ранг часов, он вытекает в негативе. и #191; C и # 243; mo podr и # 237; чтобы это упорядочивать? хороший это и он делит ее показывания info, который мне кажется супер скупым делать это экспертом и # 237; но вот то, что приходит в голову мне, с которым s и # 233;...//я помещаю c и # 243; я говорю в вопросе, что aqu и # 237; он не помещается.: S – Erikiu 12.06.2016, 12:39

Прежде всего код, который я буду перемещать тебя, служит обращая цепь текста String в Date тем, что я suguiero, что ты начал видеть использование dejcalendar, который позволяет тебе получать дату и час, начиная с этого уже одинокого был бы должен конвертировать в string час и использовать следующий код, который представил тебя: introducir la descripción de la imagen aquí

introducir la descripción de la imagen aquí

introducir la descripción de la imagen aquí

0
ответ дан 24.11.2019, 14:10
  • 1
    Лучше помещать c и # 243; я говорю в формате текст. – Webserveis 13.06.2016, 09:40
  • 2
    Привет @Jose. Пожалуйста размести c и # 243; я говорю в тексте. Если у тебя есть проблемы с форматом, ты можешь помещать флаг твоему publicaci и # 243; n и со вкусом ты помогать и # 233;. –  13.06.2016, 12:04
  • 3
    Привет, пожалуйста размести твой код для того, чтобы он был более легким. – Gemasoft 13.06.2016, 16:58

Он не имеет чувства использовать много книжный магазин дат / в час для чего-то такого простого.

Чтобы вводить данные в компьютер у тебя есть два выбора:

  • Просить час и минута по отдельности (более рекомендуемый в случае формуляра)
  • Просить час минута в string отделенный из-за ":", отделять их с .split ()

В обоих случаях, ты конвертируешь оба поля в int (санкционируя), и потом ты конвертируешь все в минуты и вычисляешь различие. Например:

  int hora1,min1,hora2,min2; // ...
  int horamin1 = hora1*60 + min1;
  int horamin2 = hora2*60 + min2;
  int totalminutos = horamin2 - horamin1;
  if(totalminutos < 0 ) totalminutos += 60*24; // intervalo corta medianoche
  boolean masde15horas = totalminutos > 15*60;
-1
ответ дан 24.11.2019, 14:10
  • 1
    Что НЕ имеет смысл, он состоит в том, чтобы не использовать API, которая решает твою необходимость. Для этого они были созданы, чтобы использовать их. – gugadev 11.06.2016, 22:22
  • 2
    В несогласии - с аргументом и с позицией. Чтобы расти. – leonbloy 11.06.2016, 22:33
  • 3
    Стой, тогда, давайте забывать APIs, которые дают нам языки, давайте забывать JSF, Спринг, Struts, Play, GWT, Vaadin и давайте использовать Servlets и тысячи librer и # 237; схвати существующие для escibir soluci и # 243; n, что уже был дан ранее, и что поставляют нас. Изобретать колесо заново не делает тебя лучшим разработчиком. Но s и # 237; чтобы практиковать l и # 243; gica подай твой soluci и # 243; n. – gugadev 11.06.2016, 22:52