Wie finde ich die Dauer der Differenz zwischen zwei Daten in Java?


103

Ich habe zwei Objekte von DateTime , die die Dauer ihrer Differenz ermitteln müssen.

Ich habe den folgenden Code, bin mir aber nicht sicher, wie ich ihn fortsetzen soll, um zu den erwarteten Ergebnissen zu gelangen:

Beispiel

      11/03/14 09:30:58
      11/03/14 09:33:43
      elapsed time is 02 minutes and 45 seconds
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/15 09:30:58
      elapsed time is a day
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:30:58
      elapsed time is two days
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:35:58
      elapsed time is two days and 05 mintues

Code

    String dateStart = "11/03/14 09:29:58";
    String dateStop = "11/03/14 09:33:43";

    Custom date format
    SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateStop);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    // Get msec from each, and subtract.
    long diff = d2.getTime() - d1.getTime();
    long diffSeconds = diff / 1000 % 60;
    long diffMinutes = diff / (60 * 1000) % 60;
    long diffHours = diff / (60 * 60 * 1000);
    System.out.println("Time in seconds: " + diffSeconds + " seconds.");
    System.out.println("Time in minutes: " + diffMinutes + " minutes.");
    System.out.println("Time in hours: " + diffHours + " hours.");

5
Bitte werfen Sie einen Blick auf die Joda-Zeit, die dies unterstützt.
Erik Pragt

1
Was ist los mit Ihrem Code, Sie brauchen nur ein paar Änderungen, um die erforderliche Ausgabe zu erreichen, lassen Sie es versuchen
Abubakkar

Finden Sie zuerst den Unterschied in Stunden, mit dem Rest den Unterschied in Minuten und dann die Sekunden!
NINCOMPOOP

1
@ PeterLawrey Ich habe verschiedene Beispiele zur Verfügung gestellt
J888

1
@aquestion-Duplizierung bedeutet zwei Fragen, die dieselben Ergebnisse erwarten. Die erwartete Ausgabe dieser Frage unterscheidet sich von der von Ihnen angegebenen.
Tim Norman

Antworten:


67

Versuche Folgendes

{
        Date dt2 = new DateAndTime().getCurrentDateTime();

        long diff = dt2.getTime() - dt1.getTime();
        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000);
        int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24));

        if (diffInDays > 1) {
            System.err.println("Difference in number of days (2) : " + diffInDays);
            return false;
        } else if (diffHours > 24) {

            System.err.println(">24");
            return false;
        } else if ((diffHours == 24) && (diffMinutes >= 1)) {
            System.err.println("minutes");
            return false;
        }
        return true;
}

20
Diese Antwort ignoriert Zeitzonen, die den Beginn und das Ende von Tagen definieren. Diese Antwort ignoriert die Sommerzeit und andere Anomalien, die bedeuten, dass ein Tag nicht immer 24 Stunden lang ist. Sehen Sie sich die richtigen Antworten an, die entweder Joda-Time- oder java.time-Bibliotheken verwenden.
Basil Bourque

3
Wie Basil betont hat, ist diese Antwort falsch. Es gibt die falsche Anzahl von Tagen an, wenn das Enddatum während der Sommerzeit liegt, das Startdatum jedoch nicht.
Dawood ibn Kareem

191

Die Datumsdifferenzkonvertierung könnte mit der in Java integrierten Klasse TimeUnit besser gehandhabt werden . Es bietet Dienstprogrammmethoden, um dies zu tun:

Date startDate = // Set start date
Date endDate   = // Set end date

long duration  = endDate.getTime() - startDate.getTime();

long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

2
Alternativ long diffInSeconds = TimeUnit.SECONDS.convert (Dauer, TimeUnit.MILLSECONDS);
Gerardw

3
Dies ist die beste Antwort.
Angel Cuenca

2
Ich stimme dieser Bewegung zu. Diese Antwort ist die beste.
Mushy

3
Keine Abhängigkeit von der Bibliothek eines Drittanbieters.
Crmepham

Hallo, zunächst einmal vielen Dank für Ihre kurze und nette Antwort. Ich habe ein Problem mit Ihrer Lösung, da ich zwei Daten habe. 06_12_2017_07_18_02_PM und ein anderes ist 06_12_2017_07_13_16_PM. Ich bekomme 286 Sekunden, stattdessen sollte ich nur 46 Sekunden bekommen
Siddhpura Amit

44

Verwenden Sie die Joda-Time- Bibliothek

DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
long hours = p.getHours();
long minutes = p.getMinutes();

Joda Time hat ein Konzept des Zeitintervalls:

Interval interval = new Interval(oldTime, new Instant());

Ein weiteres Beispiel Datumsunterschied

Noch ein Link

oder mit Java-8 (das Joda-Time-Konzepte integriert hat)

Instant start, end;//
Duration dur = Duration.between(start, stop);
long hours = dur.toHours();
long minutes = dur.toMinutes();

2
Dies sollte die akzeptierte Antwort sein. Joda Zeit ist der
richtige

Der einzig sichere Weg, um Zeitzonen, Tageslichtänderungen usw. richtig zu handhaben
Newtopian

Nur ein kleiner Tippfehler: Sie meinten in Ihrer zweiten Zeile "Ende", nicht "Stopp" ("Duration dur = Duration.between (Start, Stopp);").
Mohamad Fakih

12

So kann das Problem in Java 8 gelöst werden, genau wie die Antwort von shamimz.

Quelle: http://docs.oracle.com/javase/tutorial/datetime/iso/period.html

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);

Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);

System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)");

Der Code erzeugt eine Ausgabe ähnlich der folgenden:

You are 53 years, 4 months, and 29 days old. (19508 days total)

Wir müssen LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html verwenden , um Unterschiede zwischen Stunden, Minuten und Sekunden zu erhalten.


Es ist so sehr wie der Joda-Time-Weg, wie er von MayurB beantwortet wurde. joda-time.sourceforge.net
Johnkarka

1
Ihr Link zu Joda-Time ist alt. Aktuelle URL ist joda.org/joda-time
Basil Bourque

LocalDate speichert keine Zeit und Zeitzone. Es hält nur Tag-Monat-Jahr. siehe docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Shamim Ahmmed

Dies berücksichtigt nicht die Zeit. Die Frage des OP hatte Sekunden, Minuten und Stunden.
mkobit

7
Date d2 = new Date();
Date d1 = new Date(1384831803875l);

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000);
int diffInDays = (int) diff / (1000 * 60 * 60 * 24);

System.out.println(diffInDays+"  days");
System.out.println(diffHours+"  Hour");
System.out.println(diffMinutes+"  min");
System.out.println(diffSeconds+"  sec");

Hallo, zunächst einmal vielen Dank für Ihre kurze und nette Antwort. Ich habe ein Problem mit Ihrer Lösung, da ich zwei Daten habe. 06_12_2017_07_18_02_PM und ein anderes ist 06_12_2017_07_13_16_PM. Ich bekomme 286 Sekunden, stattdessen sollte ich nur 46 Sekunden bekommen
Siddhpura Amit

6

Sie können eine Methode wie erstellen

public long getDaysBetweenDates(Date d1, Date d2){
return TimeUnit.MILLISECONDS.toDays(d1.getTime() - d2.getTime());
}

Diese Methode gibt die Anzahl der Tage zwischen den beiden Tagen zurück.


5

Wie Michael Borgwardt in seiner Antwort hier schreibt :

int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) )

Beachten Sie, dass dies mit UTC-Daten funktioniert. Wenn Sie sich die lokalen Daten ansehen, kann der Unterschied ein freier Tag sein. Und damit es mit lokalen Daten richtig funktioniert, ist aufgrund der Sommerzeit ein völlig anderer Ansatz erforderlich.


1
Es ist keine gute Idee, diesen Wert manuell zu multiplizieren. Verwenden Sie dazu lieber die Java TimeUnit-Klasse.
Shamim Ahmmed

2
Was Sie zu lokalen Daten sagen, ist nicht wahr. Die Methode getTime () gibt gemäß API-Dokument die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT, die durch dieses Date-Objekt dargestellt werden, zurück. Wenn zwei Zahlen dieselbe Einheit haben, können sie sicher addiert und subtrahiert werden.
Ingo

1
Ja. Es ist sicher, aber der Code ist nicht sauber, da Java eine Standardmethode bietet, um damit umzugehen.
Shamim Ahmmed

1
Zusätzlich zum Bereitstellen eines Links zu einer Antwort müssen Sie den Wortlaut klar zitieren, den Sie von anderen kopiert haben.
Brad Larson

3

In Java 8 können Sie von machen DateTimeFormatter, Durationund LocalDateTime. Hier ist ein Beispiel:

final String dateStart = "11/03/14 09:29:58";
final String dateStop = "11/03/14 09:33:43";

final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendLiteral('/')
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .appendLiteral('/')
        .appendValueReduced(ChronoField.YEAR, 2, 2, 2000)
        .appendLiteral(' ')
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .toFormatter();

final LocalDateTime start = LocalDateTime.parse(dateStart, formatter);
final LocalDateTime stop = LocalDateTime.parse(dateStop, formatter);

final Duration between = Duration.between(start, stop);

System.out.println(start);
System.out.println(stop);
System.out.println(formatter.format(start));
System.out.println(formatter.format(stop));
System.out.println(between);
System.out.println(between.get(ChronoUnit.SECONDS));

3

Es hat funktioniert, ich kann es versuchen, hoffe, es wird hilfreich sein. Lassen Sie mich wissen, wenn Sie Bedenken haben.

Date startDate = java.util.Calendar.getInstance().getTime(); //set your start time
Date endDate = java.util.Calendar.getInstance().getTime(); // set  your end time

long duration = endDate.getTime() - startDate.getTime();


long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

Toast.makeText(MainActivity.this, "Diff"
        + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds, Toast.LENGTH_SHORT).show(); **// Toast message for android .**

System.out.println("Diff" + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds); **// Print console message for Java .**

1
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds (Dauer);
Keshav Gera

2

Dies ist der Code:

        String date1 = "07/15/2013";
        String time1 = "11:00:01";
        String date2 = "07/16/2013";
        String time2 = "22:15:10";
        String format = "MM/dd/yyyy HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date fromDate = sdf.parse(date1 + " " + time1);
        Date toDate = sdf.parse(date2 + " " + time2);

        long diff = toDate.getTime() - fromDate.getTime();
        String dateFormat="duration: ";
        int diffDays = (int) (diff / (24 * 60 * 60 * 1000));
        if(diffDays>0){
            dateFormat+=diffDays+" day ";
        }
        diff -= diffDays * (24 * 60 * 60 * 1000);

        int diffhours = (int) (diff / (60 * 60 * 1000));
        if(diffhours>0){
            dateFormat+=diffhours+" hour ";
        }
        diff -= diffhours * (60 * 60 * 1000);

        int diffmin = (int) (diff / (60 * 1000));
        if(diffmin>0){
            dateFormat+=diffmin+" min ";
        }
        diff -= diffmin * (60 * 1000);

        int diffsec = (int) (diff / (1000));
        if(diffsec>0){
            dateFormat+=diffsec+" sec";
        }
        System.out.println(dateFormat);

und das raus ist:

duration: 1 day 11 hour 15 min 9 sec

2

In Bezug auf Shamims Antwort-Update handelt es sich hier um eine Methode, die die Aufgabe ohne Verwendung einer Bibliothek eines Drittanbieters ausführt. Kopieren Sie einfach die Methode und verwenden Sie

public static String getDurationTimeStamp(String date) {

        String timeDifference = "";

        //date formatter as per the coder need
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //parse the string date-ti
        // me to Date object
        Date startDate = null;
        try {
            startDate = sdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //end date will be the current system time to calculate the lapse time difference
        //if needed, coder can add end date to whatever date
        Date endDate = new Date();

        System.out.println(startDate);
        System.out.println(endDate);

        //get the time difference in milliseconds
        long duration = endDate.getTime() - startDate.getTime();

        //now we calculate the differences in different time units
        //this long value will be the total time difference in each unit
        //i.e; total difference in seconds, total difference in minutes etc...
        long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
        long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
        long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
        long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

        //now we create the time stamps depending on the value of each unit that we get
        //as we do not have the unit in years,
        //we will see if the days difference is more that 365 days, as 365 days = 1 year
        if (diffInDays > 365) {
            //we get the year in integer not in float
            //ex- 791/365 = 2.167 in float but it will be 2 years in int
            int year = (int) (diffInDays / 365);
            timeDifference = year + " years ago";
            System.out.println(year + " years ago");
        }
        //if days are not enough to create year then get the days
        else if (diffInDays > 1) {
            timeDifference = diffInDays + " days ago";
            System.out.println(diffInDays + " days ago");
        }
        //if days value<1 then get the hours
        else if (diffInHours > 1) {
            timeDifference = diffInHours + " hours ago";
            System.out.println(diffInHours + " hours ago");
        }
        //if hours value<1 then get the minutes
        else if (diffInMinutes > 1) {
            timeDifference = diffInMinutes + " minutes ago";
            System.out.println(diffInMinutes + " minutes ago");
        }
        //if minutes value<1 then get the seconds
        else if (diffInSeconds > 1) {
            timeDifference = diffInSeconds + " seconds ago";
            System.out.println(diffInSeconds + " seconds ago");
        }

        return timeDifference;
// that's all. Happy Coding :)
    }

0

Dies ist ein Programm, das ich geschrieben habe und das die Anzahl der Tage zwischen zwei Daten ermittelt (hier keine Zeit).

import java.util.Scanner;
public class HelloWorld {
 public static void main(String args[]) {
  Scanner s = new Scanner(System.in);
  System.out.print("Enter starting date separated by dots: ");
  String inp1 = s.nextLine();
  System.out.print("Enter ending date separated by dots: ");
  String inp2 = s.nextLine();
  int[] nodim = {
   0,
   31,
   28,
   31,
   30,
   31,
   30,
   31,
   31,
   30,
   31,
   30,
   31
  };
  String[] inpArr1 = split(inp1);
  String[] inpArr2 = split(inp2);
  int d1 = Integer.parseInt(inpArr1[0]);
  int m1 = Integer.parseInt(inpArr1[1]);
  int y1 = Integer.parseInt(inpArr1[2]);
  int d2 = Integer.parseInt(inpArr2[0]);
  int m2 = Integer.parseInt(inpArr2[1]);
  int y2 = Integer.parseInt(inpArr2[2]);
  if (y1 % 4 == 0) nodim[2] = 29;
  int diff = m1 == m2 && y1 == y2 ? d2 - (d1 - 1) : (nodim[m1] - (d1 - 1));
  int mm1 = m1 + 1, mm2 = m2 - 1, yy1 = y1, yy2 = y2;
  for (; yy1 <= yy2; yy1++, mm1 = 1) {
   mm2 = yy1 == yy2 ? (m2 - 1) : 12;
   if (yy1 % 4 == 0) nodim[2] = 29;
   else nodim[2] = 28;
   if (mm2 == 0) {
    mm2 = 12;
    yy2 = yy2 - 1;
   }
   for (; mm1 <= mm2 && yy1 <= yy2; mm1++) diff = diff + nodim[mm1];
  }
  System.out.print("No. of days from " + inp1 + " to " + inp2 + " is " + diff);
 }
 public static String[] split(String s) {
  String[] retval = {
   "",
   "",
   ""
  };
  s = s + ".";
  s = s + " ";
  for (int i = 0; i <= 2; i++) {
   retval[i] = s.substring(0, s.indexOf("."));
   s = s.substring((s.indexOf(".") + 1), s.length());
  }
  return retval;
 }
}

http://pastebin.com/HRsjTtUf


0

Ich habe das ähnliche Problem kürzlich mit einer einfachen Methode gelöst.

public static void main(String[] args) throws IOException, ParseException {
        TimeZone utc = TimeZone.getTimeZone("UTC");
        Calendar calendar = Calendar.getInstance(utc);
        Date until = calendar.getTime();
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        Date since = calendar.getTime();
        long durationInSeconds  = TimeUnit.MILLISECONDS.toSeconds(until.getTime() - since.getTime());

        long SECONDS_IN_A_MINUTE = 60;
        long MINUTES_IN_AN_HOUR = 60;
        long HOURS_IN_A_DAY = 24;
        long DAYS_IN_A_MONTH = 30;
        long MONTHS_IN_A_YEAR = 12;

        long sec = (durationInSeconds >= SECONDS_IN_A_MINUTE) ? durationInSeconds % SECONDS_IN_A_MINUTE : durationInSeconds;
        long min = (durationInSeconds /= SECONDS_IN_A_MINUTE) >= MINUTES_IN_AN_HOUR ? durationInSeconds%MINUTES_IN_AN_HOUR : durationInSeconds;
        long hrs = (durationInSeconds /= MINUTES_IN_AN_HOUR) >= HOURS_IN_A_DAY ? durationInSeconds % HOURS_IN_A_DAY : durationInSeconds;
        long days = (durationInSeconds /= HOURS_IN_A_DAY) >= DAYS_IN_A_MONTH ? durationInSeconds % DAYS_IN_A_MONTH : durationInSeconds;
        long months = (durationInSeconds /=DAYS_IN_A_MONTH) >= MONTHS_IN_A_YEAR ? durationInSeconds % MONTHS_IN_A_YEAR : durationInSeconds;
        long years = (durationInSeconds /= MONTHS_IN_A_YEAR);

        String duration = getDuration(sec,min,hrs,days,months,years);
        System.out.println(duration);
    }
    private static String getDuration(long secs, long mins, long hrs, long days, long months, long years) {
        StringBuffer sb = new StringBuffer();
        String EMPTY_STRING = "";
        sb.append(years > 0 ? years + (years > 1 ? " years " : " year "): EMPTY_STRING);
        sb.append(months > 0 ? months + (months > 1 ? " months " : " month "): EMPTY_STRING);
        sb.append(days > 0 ? days + (days > 1 ? " days " : " day "): EMPTY_STRING);
        sb.append(hrs > 0 ? hrs + (hrs > 1 ? " hours " : " hour "): EMPTY_STRING);
        sb.append(mins > 0 ? mins + (mins > 1 ? " mins " : " min "): EMPTY_STRING);
        sb.append(secs > 0 ? secs + (secs > 1 ? " secs " : " secs "): EMPTY_STRING);
        sb.append("ago");
        return sb.toString();
    }

Und wie erwartet druckt es : 7 days ago.


-2
   // calculating the difference b/w startDate and endDate
        String startDate = "01-01-2016";
        String endDate = simpleDateFormat.format(currentDate);

        date1 = simpleDateFormat.parse(startDate);
        date2 = simpleDateFormat.parse(endDate);

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

        // using TimeUnit class from java.util.concurrent package
        long getDaysDiff = TimeUnit.MILLISECONDS.toDays(getDiff);

So berechnen Sie die Differenz zwischen zwei Daten in Java

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.