2015-08-03 5 views
5

Ich habe zwei Daten (einer davon ist die Gegenwart) und muss den Unterschied zwischen den beiden finden. Mein Code gibt mir schlechte Ergebnisse (manchmal sogar negativ).Finden Sie den genauen Unterschied zwischen zwei (Joda Time) DateTime-Objekten in Java

Ich habe versucht, die Monate, Tage, Sekunden, Stunden und Jahre Klassen und geeignete Methoden ohne Glück.

Bearbeiten: Ging zurück zu meinem ursprünglichen Code, aber ohne Dauer. @Basil Bourque hat eine großartige Lösung gepostet, aber ich habe einfach nicht genug Erfahrung mit Perioden/Dauer und all dem, um dynamisch von ihnen zu formatieren.

Lösung

public static String formattedTime(DateTime d){ 
    DateTime present = new DateTime(Calendar.getInstance()); 

    //dont really want to deal with WHY its 7hrs ahead. o well 
    DateTime date = d.minusHours(7); 

    int diff = Seconds.secondsBetween(date,present).getSeconds(); 
    String postfix = "s"; 
    Log.i("time", "" + diff); 

    if(diff>59){ 
     diff = Minutes.minutesBetween(date, present).getMinutes(); 
     postfix = "s"; 
     if(diff>59){ 
      diff = Hours.hoursBetween(date, present).getHours(); 
      postfix = "hr"; 
      if(diff>1) 
       postfix+="s"; 
      if(diff>23){ 
       diff = Days.daysBetween(date, present).getDays(); 
       postfix = "d"; 
       if(diff>6){ 
        diff = Weeks.weeksBetween(date, present).getWeeks(); 
        postfix = "wk"; 
        if(diff>1) 
         postfix+="s"; 
        if(diff>3){ 
         diff = Months.monthsBetween(date, present).getMonths(); 
         postfix = "m"; 
         if(diff>11){ 
          diff = Years.yearsBetween(date, present).getYears(); 
          postfix = "yr"; 
          if(diff>1) 
           postfix+="s"; 
         } 
        } 
       } 
      } 
     } 
    } 
    return diff+postfix; 
} 
+0

Ich habe gerade festgestellt, dass der Server in einer anderen Zeitzone ist. wird bald aktualisiert werden, wenn ich das – Zach

Antwort

5

Sie arbeiten zu hart. Sie verwenden die falsche Klasse für Ihren Zweck.

Period Klasse

In Joda-Time, verwenden Sie die Period Klasse, wenn Sie eine Zeitspanne als eine Anzahl von Jahren, Monaten darstellen wollen, Tage, Stunden, Minuten, Sekunden. Joda-Time repräsentiert eine Zeitspanne auf drei Arten: Interval, Duration oder Period.

Joda-Time folgt dem Standard ISO 8601 zum Parsen und Generieren von Stringdarstellungen der Datum-Uhrzeit-Werte. Für den Zeitraum bedeutet dies das Format PnYnMnDTnHnMnS, wobei P den Anfang markiert, während T den Jahr-Monat-Tag-Anteil vom Stunden-Minuten-Sekunden-Anteil trennt. Eine halbe Stunde ist PT30M. P3Y6M4DT12H30M5S steht für "drei Jahre, sechs Monate, vier Tage, zwölf Stunden, dreißig Minuten und fünf Sekunden". Durchsuchen Sie StackOverflow.com nach weiteren Informationen und Beispielen.

Schauen Sie sich die Klassen PeriodFormatter und PeriodFormatterBuilder an, wenn Sie mit Wörtern schön drucken wollen.

Sie können auch das Objekt Periode für die verschiedenen Komponentennummeren anfordern, wenn Sie Ganzzahlen benötigen.

Zeitzone

Außerdem sollten Sie eine Zeitzone angeben. Wenn diese Option nicht angegeben wird, wird die aktuelle Standardzeitzone des JVM implizit angewendet. Besser die Zeitzone explizit angeben, die Sie wünschen/erwarten.

Verwenden Sie immer proper time zone names, nie die 3-4 Buchstabencodes. Diese Codes sind weder standardisiert noch eindeutig. Und sie verwirren das Problem der Sommerzeit (DST).

Darüber hinaus werden Server häufig auf UTC Zeitzone gehalten. Normalerweise ist es am besten, fast alle Ihre Geschäftslogik, Datenspeicherung, Datenaustausch und Protokollierung in UTC durchzuführen.

Beispielcode

Beachten Sie, dass DateTime für aktuelle Moment ohne Beteiligung eines java.util.Date Objekt fragen kann (wie in Ihrer Frage gesehen).

Beispielcode für Periode.

DateTimeZone zone = DateTimeZone.forID("America/Detroit") ; 
DateTime then = new DateTime(yourJUDate , zone) ; 
DateTime now = DateTime.now(zone) ; 
Period period = new Period(then , now) ; 
+0

Das sieht hübsch aus Gut, aber leider bin ich mir nicht sicher, wie man den Formatierer richtig benutzt. Ich denke, Ihre Antwort ist großartig, aber es sollte auch darauf hingewiesen werden, dass getSeconds mit einem Unterschied von einem Tag 0 zurückgibt. Auch scheint der Formatierer ein bisschen begrenzt mit einer speziell für Jahre zu definieren .. aber was ist, wenn der Datumsunterschied nicht ist ein Jahr? Es würde Fälle brauchen. Am Ende habe ich wieder Tage/Sekunden/Stunden verwendet und festgestellt, dass es sich um das Datum handelt, das ich vom Server abgerufen habe, das falsch war. – Zach

+1

@Zach Wollen Sie in einer großen Anzahl von Sekunden wirklich volle Zeit springen? Mit Blick auf Ihren Code schien es, dass Sie nur nach ganzen Sekunden gefragt haben, um die anderen Granularitäten zu berechnen. Period behandelt die anderen Granularitäten, sodass keine Sekunden benötigt werden. Aber wenn Sie wirklich vollständige Sekunden haben wollen, rufen Sie ['period.toStandardSeconds()'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Period.html#toStandardSeconds--) . Für einen Zeitraum von einem Tag wird diese Methode Ihnen 24 * 60 * 60 geben. Wie für die Formatierung ist es sehr leistungsfähig, flexibel und bequem. Lesen Sie das Dokument und suchen Sie StackOverflow nach Beispielen. –

+0

Ich denke, es machte einfach Sinn, an einem Ende des Spektrums von Zeiteinheiten zu beginnen, und ich wählte Sekunden. Das ist gut zu wissen, aber ich werde definitiv versuchen, es von hier aus zu optimieren – Zach

0

Machen Sie zwei Strings, die einander vergleichen, können Sie es mit dem String # split() -Methode geteilt Jahr/Monat/Tag, um herauszufinden, usw.

+0

berücksichtigen, während das wie eine todsichere Möglichkeit scheint, um mein Ergebnis zu bekommen, ich suche nach etwas ein bisschen eleganter. Ich habe andere Fragen wie meins gelesen, wo Leute den gleichen Code benutzten und die korrekten Resultate erreichten, also darf ich Duration nicht verwenden right – Zach

1

Sie kann die Antwort nur hier sehen: Number of days between two dates und passen Sie es mit der Einheit an, die Sie wollen.

+0

In meinem Beitrag notierte ich, dass ich bereits die Tage/Sekunden/Stunden usw. Klassen probierte – Zach

Verwandte Themen