¿Cómo calcular la diferencia horaria en java?

95

Quiero restar dos periodos de tiempo, digamos 16:00:00 de 19:00:00. ¿Hay alguna función de Java para esto? Los resultados pueden estar en milisegundos, segundos o minutos.

user607304
fuente
5
probablemente joda-time.sourceforge.net
apilador

Respuestas:

116
String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime(); 

La diferencia está en milisegundos.

He modificado después sfaizs .

Uros K
fuente
7
¿Y al revés? 16:00 - 19:00? ¿Cómo puedo calcular esto?
Alex Kapustian
Invertir las variables no servirá de mucho. En este ejemplo, claro, podría invertirlas y tomar el valor absoluto o algo así. Pero, ¿qué pasa si tienes medianoche (00:00)?
rj2700
¿Y de 23:15:00 a 01:15:00?
Oleksandr
¿Qué hay de la diferencia entre las 08:00:00 de hoy y las 10:00:00 de ayer ??????? No creo que lo que sugieres sea una lógica rompible.
channae
105

Java 8 tiene una solución más limpia : Instantánea y Duración

Ejemplo:

import java.time.Duration;
import java.time.Instant;
...
Instant start = Instant.now();
//your code
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");
Anila Sebastián
fuente
Realmente me gustó tu respuesta. ¡Muy elegante! :)
Avinash
Así que esto se reduce a dos importaciones y System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));registrar la duración. No llamaría a eso una solución agradable y limpia en Java8 si otros lenguajes pueden hacerlo con un código como print("Duration: " + str(time.time()-start))...
Luc
3
@Luc limpieza no es lo mismo que brevedad. Es mucho más claro exactamente lo que está sucediendo en la versión de Java 8, y también es mucho más fácil de modificar si, por ejemplo, desea informar la duración entre dos instantes en una unidad que no sea milisegundos, o como unidades múltiples (por ejemplo, en 1h 15m 3.022slugar de 4503022 milliseconds) .
JakeRobb
40

PARA obtener bonitas diferencias de tiempo, entonces

// d1, d2 are dates
long diff = d2.getTime() - d1.getTime();

long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);

System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
Fizer Khan
fuente
realmente gran respuesta
Palanivelraghul
32

Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter);
LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter);

long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis();
long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds();
long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();
Alex B
fuente
1
Esto también está disponible para Java SE 6 y 7 como puerto posterior , así como para Android .
Bryan
11

Como cualquier otro idioma; Convierta sus períodos de tiempo a una marca de tiempo Unix (es decir, segundos desde la época Unix) y luego simplemente reste. Luego, los segundos resultantes deben usarse como una nueva marca de tiempo de Unix y leerse formateados en el formato que desee.

Ah, dale al cartel de arriba (genesiss) su debido crédito, el código siempre es útil;) Sin embargo, ahora también tienes una explicación :)

cristiano
fuente
8
import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds. 
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.

y, para mostrar en un formato más agradable, puede usar:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
Alisa
fuente
Esto duplica otra respuesta y no agrega contenido nuevo. No publique una respuesta a menos que tenga algo nuevo que aportar.
DavidPostill
@DavidPostill, gracias por su atención. Pero la solución que necesitaba y no encontré en la publicación de GENESIS fue la diferencia de tiempo entre la ejecución de dos líneas de código (como el punto de inicio y el punto final del programa o antes y después de ejecutar un método, no algunos tiempos estáticos) . Pensé que esto podría ayudar.
Alisa
2

La forma dolorosa es convertir a milis y hacer la resta y luego volver a los segundos que desee. La mejor forma es utilizar JodaTime .

Manfred Moser
fuente
1
Nunca mencioné las marcas de tiempo de Unix. También es un hecho bien conocido que la API de fecha y hora de Java apesta para un uso más que ocasional. JodaTime es mucho mejor y probablemente sea el camino a seguir hasta que JSR 310 sea parte de Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: debería haberlo hecho ... Tanto las clases de tiempo predeterminadas de Java como Joda dan un tiempo en milisegundos que comienza en lo que se llama la época de Unix . En este punto, se acercan mucho a las marcas de tiempo de Unix (una en milisegundos y la otra en segundos). En cualquier caso, lo que quiere el OP se puede hacer trivialmente utilizando las clases de Java predeterminadas, tomando el número de milis desde la época de Unix y restándolos.
Sintaxis T3rr0r
1
Seguro que se puede hacer trivialmente. Y si realiza muchos cálculos de fecha y hora en su aplicación, también puede crear trivialmente muchos errores usted mismo y reinventar su propia pequeña biblioteca implementando partes de JodaTime usted mismo nuevamente. Para un cálculo simple que podría estar bien, pero para un uso frecuente, vale la pena usar una biblioteca decente. Solo estoy tratando de señalar que la primera solución simple podría no llevarlo por el mejor camino. ¿Qué está mal con eso?
Manfred Moser
3
@Manfred Moser: En realidad, la primera solución simple es el camino correcto, considerando que el OP pidió la diferencia entre dos períodos de tiempo, no cambios en un reloj atómico :)
Christian
Claro ... solo para este ejemplo y pregunta específica. Sin embargo, no para el panorama general.
Manfred Moser
2
String start = "12:00:00";
String end = "02:05:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); 

Date date1 = format.parse(start);

Date date2 = format.parse(end);

long difference = date2.getTime() - date1.getTime(); 

int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);

if(minutes<0)minutes += 1440; 

Ahora los minutos serán la duración correcta entre dos tiempos (en minutos).

Md. Rayhanuzzaman Roky
fuente
2
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception{
    String time1 = "12:00:00";
    String time2 = "12:01:00";
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
    Date date1 = format.parse(time1);
    Date date2 = format.parse(time2);
    long difference = date2.getTime() - date1.getTime();
    System.out.println(difference/1000);
}}

lanza excepciones maneja las excepciones de análisis

Sushmidha Sakthiveeran
fuente
2

Además del enfoque más común con los objetos Periodo y Duración, puede ampliar sus conocimientos con otra forma de lidiar con el tiempo en Java.

Bibliotecas avanzadas de Java 8. ChronoUnit para las diferencias.

ChronoUnit es una excelente manera de determinar qué tan separados están dos valores Temporales. Temporal incluye LocalDate , LocalTime y así sucesivamente.

LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);

System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException

El primer ejemplo muestra que entre trunca en lugar de rondas.

El segundo muestra lo fácil que es contar diferentes unidades.

Y el último ejemplo nos recuerda que no debemos estropear las fechas y horas en Java :)

Alejandro
fuente
1

Opción alternativa si se toma el tiempo de diferentes días, por ejemplo: 22:00 y 01:55.

public static long getDiffTime(Date date1, Date date2){
        if (date2.getTime() - date1.getTime() < 0) {// if for example date1 = 22:00, date2 = 01:55.
            Calendar c = Calendar.getInstance();
            c.setTime(date2);
            c.add(Calendar.DATE, 1);
            date2 = c.getTime();
        } //else for example date1 = 01:55, date2 = 03:55.
        long ms = date2.getTime() - date1.getTime();

        //235 minutes ~ 4 hours for (22:00 -- 01:55).
        //120 minutes ~ 2 hours for (01:55 -- 03:55).
        return TimeUnit.MINUTES.convert(ms, TimeUnit.MILLISECONDS);
    }
usuario3541830
fuente
1
public class timeDifference {

public static void main(String[] args) {

    try {

        Date startTime = Calendar.getInstance().getTime();
        Thread.sleep(10000);
        Date endTime = Calendar.getInstance().getTime();

        long difference = endTime.getTime() - startTime.getTime();

        long differenceSeconds = difference / 1000 % 60;
        long differenceMinutes = difference / (60 * 1000) % 60;
        long differenceHours = difference / (60 * 60 * 1000) % 24;
        long differenceDays = difference / (24 * 60 * 60 * 1000);

        System.out.println(differenceDays + " days, ");
        System.out.println(differenceHours + " hours, ");
        System.out.println(differenceMinutes + " minutes, ");
        System.out.println(differenceSeconds + " seconds.");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Dinesh
fuente
1

Prueba esto:

public String timeDifference8(String startTime, String endTime) {
    LocalTime initialTime = LocalTime.parse(startTime);
    LocalTime finalTime =LocalTime.parse(endTime);
    StringJoiner joiner = new StringJoiner(":");
    long hours = initialTime.until( finalTime, ChronoUnit.HOURS);
    initialTime = initialTime.plusHours( hours );
    long minutes = initialTime.until(finalTime, ChronoUnit.MINUTES);
    initialTime = initialTime.plusMinutes( minutes );
    long seconds = initialTime.until( finalTime, ChronoUnit.SECONDS);
    joiner.add(String.valueOf(hours));
    joiner.add(String.valueOf(minutes));
    joiner.add(String.valueOf(seconds));
    return joiner.toString();
}
Bhavish Salian
fuente
1
import java.sql.*;

class Time3 {

    public static void main(String args[]){ 
        String time1 = "01:03:23";
        String time2 = "02:32:00";
        long difference ;
        Time t1 = Time.valueOf(time1);
        Time t2 = Time.valueOf(time2);
        if(t2.getTime() >= t1.getTime()){
            difference = t2.getTime() - t1.getTime() -19800000;
        }
        else{
            difference = t1.getTime() - t2.getTime() -19800000;
        }

        java.sql.Time time = new java.sql.Time(difference); 
        System.out.println(time);
    } 

} 
tharsikan
fuente
1

Encontré esto más limpio.

       Date start = new Date();
        //Waiting for 10 seconds
        Thread.sleep(10000);
        Date end = new Date();
        long diff = end.getTime() - start.getTime();
        String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
                Long.toString(TimeUnit.MILLISECONDS.toHours(diff)), 
                TimeUnit.MILLISECONDS.toMinutes(diff),
                TimeUnit.MILLISECONDS.toSeconds(diff));
        System.out.println(String.format("Time taken %s", TimeTaken));

Salida : Tiempo empleado [0] horas: [0] minutos: [10] segundos

Amit Shakya
fuente
0
    /*
 * Total time calculation.
 */
private void getTotalHours() {
    try {
        // TODO Auto-generated method stub
        if (tfTimeIn.getValue() != null && tfTimeOut.getValue() != null) {
            Long min1 = tfTimeOut.getMinutesValue();
            Long min2 = tfTimeIn.getMinutesValue();
            Long hr1 = tfTimeOut.getHoursValue();
            Long hr2 = tfTimeIn.getHoursValue();
            Long hrsTotal = new Long("0");
            Long minTotal = new Long("0");
            if ((hr2 - hr1) == 1) {
                hrsTotal = (long) 1;
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    hrsTotal++;
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) > 0) {
                hrsTotal = (hr2 - hr1);
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) == 0) {
                if (min1 != 0 || min2 != 0) {
                    if (min2 > min1) {
                        hrsTotal = (long) 0;
                        minTotal = min2 - min1;
                    } else {
                        Notification.show("Enter A Valid Time");
                        tfTotalTime.setValue("00.00");
                    }
                }
            } else {
                Notification.show("Enter A Valid Time");
                tfTotalTime.setValue("00.00");
            }
            String hrsTotalString = hrsTotal.toString();
            String minTotalString = minTotal.toString();
            if (hrsTotalString.trim().length() == 1) {
                hrsTotalString = "0" + hrsTotalString;
            }
            if (minTotalString.trim().length() == 1) {
                minTotalString = "0" + minTotalString;
            }
            tfTotalTime.setValue(hrsTotalString + ":" + minTotalString);
        } else {
            tfTotalTime.setValue("00.00");
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

fuente
2
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Benjamin W.
0

class TimeCalculator {String updateTime;

     public TimeCalculator(String time)
      {
        // time should be in 24 hours format like 15/06/2016 17:39:20  
        this.updateTime = time;
      }

     public String getTimeDifference()
     {
        String td=null;
       // get Current Time
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        Date currentDate = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(currentDate);

        int c_year = calendar.get(Calendar.YEAR);
        int c_month = calendar.get(Calendar.MONTH) + 1;
        int c_day = calendar.get(Calendar.DAY_OF_MONTH);

        // get Editing Time

        Date edit_date = sdf.parse(updateTime);
        Calendar edit_calendar = new GregorianCalendar();
        edit_calendar.setTime(edit_date);

        int e_year = edit_calendar.get(Calendar.YEAR);
        int e_month = edit_calendar.get(Calendar.MONTH) + 1;
        int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH);


        if(e_year==c_year&&e_month==c_month&&e_day==c_day)
            {

             int c_hours = calendar.get(Calendar.HOUR_OF_DAY);
             int c_minutes = calendar.get(Calendar.MINUTE);
             int c_seconds = calendar.get(Calendar.SECOND);

             int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY);
             int e_minutes = edit_calendar.get(Calendar.MINUTE);
             int e_seconds = edit_calendar.get(Calendar.SECOND);

      if(c_hours==e_hours&&c_minutes==e_minutes&&c_seconds==e_seconds)
         {
           td = "just now";
           return td;
          }
      else if(c_hours==e_hours&&c_minutes==e_minutes)
       {
         int d_seconds = c_seconds-e_seconds;
         td = String.valueOf(d_seconds);
         td = td+" seconds ago";
         return td;
       }
      else if(c_hours==e_hours&&c_minutes!=e_minutes)
       {
         int d_minutes = c_minutes-e_minutes;
         int d_seconds;
         if(c_seconds>e_seconds)
           {
             d_seconds = c_seconds-e_seconds;
           }else{
             d_seconds = e_seconds-c_seconds;
       }
          td = "00:"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
        return td;
  }
    else
       {
        int d_minutes,d_seconds,d_hours;
        d_hours=c_hours-e_hours;
        if(c_minutes>e_minutes)
       {
         d_minutes = c_minutes-e_minutes;
       }else{
         d_minutes = e_minutes-c_minutes;
       }
        if(c_seconds>e_seconds)
          {
            d_seconds = c_seconds-e_seconds;
          }else{
            d_seconds = e_seconds-c_seconds;
          }

      td = String.valueOf(d_hours)+":"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
     return td;
  }
}
 else if(e_year==c_year&&e_month==c_month&&c_day==e_day+1){
   td = "yesterday";
   return td;
 }
 else{
    td = updateTime;
    return td;
     }
}}
Prashant Kumar
fuente