Zahl in Zeit umwandeln?

AluCeen

Grünschnabel
Hi... ich hätte da ein Problem:

Ich musste eine Zahl in eine Zeit umrechnen.

Folgendes Beispiel:
......................................................................................................................
long start = System.currentTimeMillis();

long diff = System.currentTimeMillis() - start;

System.out.println("Die Anwendung hat " + diff + " Millisekunden gedauert");
.........................................................................................................................
mit dem Code lasse Ich mir berechnen, wie lange eine Anwendung braucht, um einen Prozess auszuführen, jedoch wird mir das nur als millisekunde ausgegeben. Ich hätte es aber gerne so, das man die Ausgabe von: bla bla Stunden, bla bla Minuten und blabla sekunden hat. Ich kann ja mit einer mathematischen Formel das umrechnen, aber wie bekomme Ich es hin, das dieses Programm weiß, das eine Minute 60 Sekunden hat und keine 100?
 
Code:
public static synchronized String mSecToMin (double Expression) {
 	double intern_sec = Expression/1000;
 	int digits = 2;
 	java.text.DecimalFormat dfD = (java.text.DecimalFormat)java.text.DecimalFormat.getInstance();
 	dfD.setMinimumIntegerDigits(2);
 	return FormatList.F00((int)(intern_sec/60)) + ":"
 	        + dfD.format((Math.round((intern_sec % 60) * Math.pow(10, digits)) / Math.pow(10, digits)))
 	        + " min";
 }

.. so in etwa :)

Dirk
 
mmmh... damit kann Ich jetzt kaum was anfangen... bin grad noch am Anfag der java-programmierung und weiß nicht wo ich das einbauen soll... ich tue mal den ganzen code rein:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Progress extends JFrame {

JProgressBar current;
JTextArea out;
JButton find;
Thread runner;
int num = 2000;

public Progress() {
super("Progress");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
current = new JProgressBar(0, 2000);
current.setValue(0);
current.setStringPainted(true);
current.setOrientation(JProgressBar.VERTICAL);
add(current);
}


public void iterate() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) { }
while (num >= 0)
{
current.setValue(num);
if (num == 1000) {
current.setOrientation(JProgressBar.HORIZONTAL);
current.setValue(num);
}
if (num == 500) {
current.setOrientation(JProgressBar.VERTICAL);
}
try {
Thread.sleep(0300);
} catch (InterruptedException e) { }
num -= 100;
}
}

public static void main(String[] arguments) {
long start = System.currentTimeMillis();
Progress frame = new Progress();
frame.pack();
frame.setVisible(true);
frame.iterate();
long diff = System.currentTimeMillis() - start;
long milli = (diff / 100 * 60);
long sekunden = (diff / 1000);
long minuten = (diff / 1000) / 60;
long stunden = diff / 1000 / 60 / 60;
System.out.println("Die Anwendung hat " + diff + " Millisekunden gedauert");
System.out.println("Die Anwendung hat " + sekunden + " Sekunden gedauert");
System.out.println("Die Anwendung hat " + minuten + " Minuten gedauert");
System.out.println("Die Anwendung hat " + stunden + " Stunden gedauert");




}
}

wäre super wenn mir das jemand da rein setzt... ich versteh echt kaum was davon :-(
 
Mhh, klar könnte dir das jemand da reinsetzen, wenn du das aber echt nicht selber hinbekommst, dann haste tatsächlich NULL Ahnung von java und dann ist dir mit dem 'Reinsetzen' nicht geholfen!!

Kuck dir den prinzipiellen Aufbau einer java-Klasse an, dann überleg wo public .. String mSecToMin (..) { .. } reinpassen könnte und wie du das aufrufst!

Ich denke damit ist dir mehr geholfen, als mit der Lösung - sorry

Dirk
 
omg... ich hab das jetzt rein gesetz, aber die zeile mit dem ,,return FormatList....'' wird rot... d.h. irgendwas ist falsch. ich hab das vor die puplic static void main gesetzt... dachte das wäre so in Ordnung.... nur muss Ich die aufgabe bis viertel nach 11 gelöst haben...
 
ups - sorry

mach aus FormatList.F00 -> new java.text.DecimalFormat("00").format

Dirk

noch 30 Sekunden .. tick tick tick *gg*
 
So.. nun habe Ich das gemacht... aber Ich glaub das mit der Ausgabe ist immernoch nicht so, wie Ich es gern hätte :-(
Denn wenn Ich die Anwendung ausführe, bekomme ich gesagt, das es z.B. 6 Sekunden gedauert hat und 6834 Millisekunden, aber das stimmt ja nicht, da es nur 0,834 millisekunden.... ich glaub Ich sollte es einfach lassen....
Wenn Ich schon mit so einer Aufgabe nicht klar komme, wie soll Ich dann erst in der Ausbildung weiter machen?

Offtopic: Du hast eine tolle Weppage Dirk, aber auf der 1. Seite ist ein Fehler und zwar:

Und so meldete ich ... an und ,,gründete,, .....

Ich denke mal Du hättest das selber schon noch gesehn, aber Ich hab auch ein paar Pages und da kann man ja nicht auf alles achten oder?^^


also... wie funktioniert das hier denn alles... Ich muss das jetzt noch hin bekommen. Sonst bekomm ich noch ärger vom Praktikumsleiter....




import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Progress extends JFrame {

JProgressBar current;
JTextArea out;
JButton find;
Thread runner;
int num = 2000;

public Progress() {
super("Progress");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
current = new JProgressBar(0, 2000);
current.setValue(0);
current.setStringPainted(true);
current.setOrientation(JProgressBar.VERTICAL);
add(current);
}


public void iterate() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) { }
while (num >= 0)
{
current.setValue(num);
if (num == 1000) {
current.setOrientation(JProgressBar.HORIZONTAL);
current.setValue(num);
}
if (num == 500) {
current.setOrientation(JProgressBar.VERTICAL);
}
try {
Thread.sleep(0300);
} catch (InterruptedException e) { }
num -= 100;
}
}

public static synchronized String mSecToMin (double Expression) {
double intern_sec = Expression/1000;
int digits = 2;
java.text.DecimalFormat dfD = (java.text.DecimalFormat)java.text.DecimalFormat.getInstance();
dfD.setMinimumIntegerDigits(2);
return new java.text.DecimalFormat("00").format((int)(intern_sec/60)) + ":"
+ dfD.format((Math.round((intern_sec % 60) * Math.pow(10, digits)) / Math.pow(10, digits)))
+ " min";
}

public static void main(String[] arguments) {
long start = System.currentTimeMillis();
Progress frame = new Progress();
frame.pack();
frame.setVisible(true);
frame.iterate();
long diff = System.currentTimeMillis() - start;
long sekunden = (diff / 1000);
long minuten = (diff / 1000) / 60;
long stunden = diff / 1000 / 60 / 60;

System.out.println("Die Anwendung dauerte " + minuten + " Minuten, " + sekunden + " Sekunden und " + diff + " Millisekunden");




}
}
 
Okay - also erst mal das Prinzip:

du teils die Anzahl der Sekunden - sagen wir mal 7925 - / 3600, dann bekommst du den Teil Stunden raus. Also 2,2 - davon den ganzen Teil macht 2. Diese Sekunden musst du natürlich von gesamt abziehen also 7920 - (2*3600) macht 725 Sekunden Rest. Nun das selbe Spiel mit Minuten also statt 3600 60 und du erhälst 12.083 also 12 und 5 Rest. Das sind die Sekunden!

02:12:05 :) -

Funktionen brauchst du halt - ggf mal googlen wenn dir das nix sagt -

java.math.floor() .. Ganzzahlen
und java.text.DecimalFormat() für die führenden Nullen - der rest ist einfach rechnen .. das obere Skript is schon bissel älter, also alle die das sehen, ich würde das heut auch anders machen *gg*

Dirk
 
Ich glaub Ich hab heut nen Blackout...

Wie soll Ich denn die Sekunden mit einem wert teilen, wenn die Sekunden doch immer anders sind..ausserdem weiß ich gar nicht was ich dann im system.out eingeben muss damit ich so eine schöne ausgabe hab... Ich frag mich langsam ob Ich zu blöd bin um das zu verstehen!? Könntest Du mir das einmal umsetzen in meinem code... dann kann ich mir das wenigstens mal anschaun und wüsste, wie es funktioniert... ich glaub ich verstehe sonst nur bahnhof... aber es ist ja auch verständlich: Java lernt man nicht in 4 Tagen!
 
Code:
  long start = System.currentTimeMillis();
  ... eine Anweisungen ...
  long diff = System.currentTimeMillis() - start;
  long sekunden = (diff / 1000);
  long stunden = (long)Math.floor(sekunden / 3600);
    sekunden -= (stunden*3600); // restlichen Sekunden
  long minuten = (long)Math.floor(sekunden / 60);
    sekunden -= (minuten*60); // restlichen Sekunden

  System.out.println("Die Anwendung dauerte " + stunden + " Stunden, " + minuten + " Minuten, " + sekunden + " Sekunden und " + (diff % 1000) + " Millisekunden");

zufrieden? ;)

Dirk
 
Zurück