Differenz zwischen 2 Zeitpunkten berechnen

nchristoph

Erfahrenes Mitglied
Hallo,

ich habe folgende Frage:

Wie berechnet man richtig die Differenz zwischen 2 Zeitpunkten.

Z.b.: Ich starte um 18:00 und stoppe um 19:56.

Wie berechne ich mit Java richtig die Differenz.

Meine aktueller Lösungsansatz ist folgender:

Java:
            long oldtime = System.currentTimeMillis();
            long currentTime = System.currentTimeMillis();
            long difference = currenttime - oldtime;
             
            if(difference >= 60000){
            core.objectService.destroyObject(object.getObjectID());
            actor.sendSystemMessage("@travel:pickup_timeout", DisplayType.Broadcast);
            }

Die if trifft allerdings nie zu. Rechne ich falsch oder habe ich irgendwo einen anderen Fehler?
 

Fabio Hellmann

Erfahrenes Mitglied
Hi,

Dein Ansatz ist der Richtige ;)
Du musst nun nur noch das oldtime durch deine richtige Zeit ersetzen und nicht System.currentTimeMillis() verwenden. Ansonsten vergleichst du die aktuelle Zeit mit der aktuellen Zeit und da diese beiden Aufrufe weniger als 60.000 Millisekunden dauern, wirst du nie eine Differenz erhalten, die größer ist. Also ersetze:

Java:
long oldtime = .... // Deine Anfangszeit zu der du begonnen hast zu stoppen

Viele Grüße
Fabio
 

nchristoph

Erfahrenes Mitglied
Das problem ist, das es im Prinzip immer sein kann, das diese Funktion aufgerufen wird. Wie krieg ich so eine Art Countdown von 60 sekunden am besten hin?
 

Fabio Hellmann

Erfahrenes Mitglied
Damit ich das richtig verstehe, du willst in der Methode 60 Sekunden warten, bevor du den Rest ausführst und zurück kehrst?
Wenn das der Fall ist, dann solltest du Thread.sleep(60000) verwenden.
 

saftmeister

Nutze den Saft!
Dann brauchst du die if-Abfrage ja nicht, wenn du mit Thread.sleep() arbeitest. Das hier sollte doch eigentlich den Zweck erfüllen:

Java:
            try
            {
              Thread.sleep(60000);
              core.objectService.destroyObject(object.getObjectID());
              actor.sendSystemMessage("@travel:pickup_timeout", DisplayType.Broadcast);
            }
            catch(InterruptedException ex)
            {
               // Todo....
            }

Wenn das nicht der Fall sein sollte, wirst du wohl etwas mehr Code-Kontext zeigen müssen, um zu verstehen, wie der Ablauf sein soll. Falls das asynchron ausgeführt werden soll, kannst du ja mit Runnable arbeiten.
 

nchristoph

Erfahrenes Mitglied
Java:
  public void checkForItvDespawn(CreatureObject actor, SWGObject object){

     scheduler.schedule(new Runnable() {
       public void run() {
         try {

           if (object != null && actor.getPosition().getDistance2D(object.getPosition()) > 50){
             core.objectService.destroyObject(object);
             actor.sendSystemMessage("@travel:pickup_cancel", DisplayType.Broadcast);
           }
           
           long oldtime = System.currentTimeMillis();
           
           if(object != null && System.currentTimeMillis() - oldtime > 60000){
             core.objectService.destroyObject(object);
             actor.sendSystemMessage("@travel:pickup_timeout", DisplayType.Broadcast);
           }


         }catch (Exception e) {
           e.printStackTrace();
           
         }
       }
     }, 1, TimeUnit.SECONDS);

   }

Der erste if Block funktioniert, der 2te eben nicht.
 

Fabio Hellmann

Erfahrenes Mitglied
Das liegt genau daran, was ich dir vorhin erklärt habe. Du initialisierst oldtime mit der aktuellen Systemzeit und fragst gleich in der nächsten Zeile ab, ob die Systemzeit - oldtime größer ist als 60 Sekunden, was aber nie der Fall sein wird. Du müsstest jetzt zwischen oldtime und der IF-Bedingung das Thread.sleep einbauen.

Java:
...

long oldtime =System.currentTimeMillis();

Thread.sleep(60000);

if(object !=null&&System.currentTimeMillis()- oldtime >60000){

...
 

saftmeister

Nutze den Saft!
Aber warum dann überhaupt noch die 2. if-Abfrage? Wenn ohnehin mittels Thread.sleep() 60 Sekunden gewartet wird, ist die Bedingung immer erfüllt. Wenn Thread.sleep() unterbrochen werden sollte, tritt eine InterruptedException auf und dann wird der Code danach ohnehin nicht mehr ausgeführt.

Ich würde es so notieren:

Java:
  public void checkForItvDespawn(CreatureObject actor, SWGObject object){

     new Runnable() {
       public void run() {
         try {

           if (object != null)
           {
             if(actor.getPosition().getDistance2D(object.getPosition()) > 50)
             {
               core.objectService.destroyObject(object);
               actor.sendSystemMessage("@travel:pickup_cancel", DisplayType.Broadcast);
             }
          
             Thread.sleep(60000);

             core.objectService.destroyObject(object);
             actor.sendSystemMessage("@travel:pickup_timeout", DisplayType.Broadcast);
           }
         }
         catch (Exception e)
         {
           e.printStackTrace();
         }
       }
     }.run();
   }
 
Zuletzt bearbeitet:

Fabio Hellmann

Erfahrenes Mitglied
@saftmeister: Da muss ich dir Recht geben. Ich kann allerdings auch immer noch nicht so ganz nachvollziehen, für was dieser Warte-Prozess gut sein soll bzw. gebraucht wird. Deshalb habe ich es so umgesetzt, da ich davon ausgegangen bin, dass noch etwas dazu kommen wird zwischen Thread.sleep() (oder einer wohl möglich zeitraubenden Operation) und der If-Bedingung.

Man darf also weiterhin gespannt sein :)
 

Neue Beiträge