Wie berechnet man den Zeitunterschied in Java?

94

Ich möchte zwei Zeiträume von 16:00:00 von 19:00:00 subtrahieren. Gibt es dafür eine Java-Funktion? Die Ergebnisse können in Millisekunden, Sekunden oder Minuten angegeben werden.

user607304
quelle
5
wahrscheinlich joda-time.sourceforge.net
Stapler

Antworten:

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

Der Unterschied wird in Millisekunden angegeben.

Ich habe sfaizs post geändert .

Uros K.
quelle
7
was ist mit dem anderen Weg? 16:00 - 19:00? Wie kann ich das berechnen?
Alex Kapustian
Das Invertieren der Variablen bringt nicht viel. In diesem Beispiel können Sie sie natürlich invertieren und den absoluten Wert oder etwas anderes annehmen. Aber was passiert, wenn Sie Mitternacht haben (00:00)?
rj2700
Was ist mit 23:15:00 - 01:15:00?
Oleksandr
Was ist mit dem Unterschied zwischen 08:00:00 heute und gestern 10:00:00 ??????? Ich glaube nicht, dass Sie eine zerbrechliche Logik vorgeschlagen haben.
Kanal
104

Java 8 hat eine sauberere Lösung - Sofort und Dauer

Beispiel:

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 Sebastian
quelle
Ihre Antwort hat mir sehr gut gefallen. Sehr elegant! :)
Avinash
Das läuft also auf zwei Importe hinaus und System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));um die Dauer zu protokollieren. Ich würde das nicht als eine schöne und saubere Lösung in Java8 bezeichnen, wenn andere Sprachen dies mit Code wie print("Duration: " + str(time.time()-start))... tun könnten
Luc
3
@ Luc Sauberkeit ist nicht gleich Kürze. Es ist viel klarer, was genau in der Java 8-Version passiert, und es ist auch viel einfacher zu optimieren, wenn Sie beispielsweise die Dauer zwischen zwei Zeitpunkten in einer anderen Einheit als Millisekunden oder als mehrere Einheiten (z. B. 1h 15m 3.022sanstelle von 4503022 milliseconds) angeben möchten. .
JakeRobb
39

Um dann ziemlich zeitliche Unterschiede zu bekommen

// 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
quelle
wirklich tolle Antwort
Palanivelraghul
31

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 Bretet
quelle
1
Dies ist auch für Java SE 6 und 7 als Backport sowie für Android verfügbar .
Bryan
11

Genau wie jede andere Sprache; Konvertieren Sie Ihre Zeiträume in einen Unix-Zeitstempel (dh Sekunden seit der Unix-Epoche) und subtrahieren Sie dann einfach. Die resultierenden Sekunden sollten dann als neuer Unix-Zeitstempel verwendet und in einem beliebigen Format formatiert gelesen werden.

Ah, gib dem obigen Poster (Genesiss) seine gebührende Anerkennung, Code ist immer griffbereit;) Allerdings hast du jetzt auch eine Erklärung :)

Christian
quelle
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.

und um in einem schöneren Format zu zeigen, können Sie verwenden:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
Alisa
quelle
Dies dupliziert eine andere Antwort und fügt keinen neuen Inhalt hinzu. Bitte posten Sie keine Antwort, es sei denn, Sie haben tatsächlich etwas Neues beizutragen.
DavidPostill
@ DavidPostill, danke für deine Köpfe hoch. Aber die Lösung, die ich selbst brauchte und im Beitrag von GENESIS nicht gefunden habe, war der Zeitunterschied zwischen der Ausführung von zwei Codezeilen (wie dem Start- und Endpunkt des Programms oder vor und nach dem Ausführen einer Methode, nicht einige statische Zeiten). . Ich dachte, das könnte helfen.
Alisa
2

Der schmerzhafte Weg besteht darin, in Millis zu konvertieren und die Subtraktion durchzuführen und dann zu den gewünschten Sekunden zurückzukehren. Der bessere Weg ist, JodaTime zu verwenden .

Manfred Moser
quelle
1
Ich habe nie Unix-Zeitstempel erwähnt. Es ist auch eine bekannte Tatsache, dass die Java-API für Datum und Uhrzeit mehr als nur gelegentlich verwendet wird. JodaTime ist viel besser und wahrscheinlich der richtige Weg, bis JSR 310 Teil von Java ist. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: Vielleicht sollten Sie ... Sowohl die Standard-Java-Zeitklassen als auch Joda geben eine Zeit in Millis an, die von der sogenannten Unix- Epoche ausgeht . Zu diesem Zeitpunkt kommen sie den Unix- Zeitstempeln verdammt nahe (einer in Millis, der andere in Sekunden). In jedem Fall kann das, was das OP will, trivial mit den Standard-Java-Klassen durchgeführt werden, wobei die Anzahl der Millis seit der Unix- Epoche genommen und subtrahiert wird.
SyntaxT3rr0r
1
Sicher kann es trivial gemacht werden. Und wenn Sie in Ihrer App viele Datums- und Zeitberechnungen durchführen, können Sie auch trivial viele Fehler selbst erstellen und Ihre eigene kleine Bibliothek neu erfinden, indem Sie Teile von JodaTime erneut selbst implementieren. Für eine einfache Berechnung, die vielleicht in Ordnung ist, aber für den häufigen Gebrauch lohnt es sich, eine anständige Bibliothek zu verwenden. Ich versuche nur darauf hinzuweisen, dass die erste einfache Lösung Sie möglicherweise nicht auf den besten Weg führt. Was stimmt damit nicht?
Manfred Moser
3
@Manfred Moser: Eigentlich ist die erste einfache Lösung ist der richtige Weg, wenn man bedenkt das OP für die Differenz zwischen zwei Zeitperioden gefragt, ändert sich nicht in einer Atomuhr :)
Christian
Sicher .. nur für dieses Beispiel und eine bestimmte Frage. Nicht für das Gesamtbild.
Manfred Moser
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);
}}

löst eine Ausnahme aus, die Ausnahmen analysiert

Sushmidha Sakthiveeran
quelle
2

Neben dem gängigsten Ansatz für Perioden- und Dauerobjekte können Sie Ihr Wissen auf eine andere Art und Weise erweitern, um mit der Zeit in Java umzugehen.

Erweiterte Java 8-Bibliotheken. ChronoUnit für Unterschiede.

ChronoUnit ist eine gute Möglichkeit, um festzustellen, wie weit zwei zeitliche Werte voneinander entfernt sind. Temporal umfasst LocalDate , LocalTime usw.

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

Das erste Beispiel zeigt, dass zwischen Kürzungen und nicht zwischen Runden.

Die zweite zeigt, wie einfach es ist, verschiedene Einheiten zu zählen.

Und das letzte Beispiel erinnert uns daran, dass wir in Java nicht mit Datum und Uhrzeit verwechseln sollten :)

Alexander
quelle
1

Alternative Option, wenn Zeit von verschiedenen Tagen genommen wird, zum Beispiel: 22:00 und 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);
    }
user3541830
quelle
1
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; 

Jetzt haben Minuten die richtige Dauer zwischen zwei Zeitpunkten (in Minuten).

Md. Rayhanuzzaman Roky
quelle
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
quelle
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
quelle
1

Ich fand das sauberer.

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

Ausgabe : Zeitaufwand [0] Stunden: [0] Minuten: [10] Sekunden

Amit Shakya
quelle
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();
    }
}

quelle
2
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Benjamin W.
0

Klasse 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
quelle
0

Versuche dies:

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
quelle