Zeitfunktion, die die Sekunden berechnet?

Status
Nicht offen für weitere Antworten.

Zeimen

Mitglied
Hallo,
habe mich soebend hier registriert und bin gerade dabei eine kleine Übungsaufgabe in Java zu programmieren.

Deshalb meine Frage:

Ich gebe zum Beispiel in einem Textfield: 12:34:24 ein.
Wie kann ich diesen String in ein Zeitformat umwandeln. Ich weiss, da gibt es hier schon ein Thread drüber.

Aber ich hab noch ne weitere Frage: Gibt es irgendeine Zeitmethode in Java, die automatisch aus diesem Zeitformat die Sekunden berechnet? Kann man zwar auch leicht selber programmieren, aber meine Aufgabe ist es, zu recherchieren, ob es nicht eine Funktion gibt, die das für mich erledigen könnte.

Danke schon mal für eure Hilfe!!

Gruß,

Zeimen
 
Selbst geschrieben habe ich es schon. Aber meine Aufgabe ist es herauszufinden, ob es da schon eine Methode gibt.

Im Grunde genommen muss ich 2 Zeiten miteinander vergleichen.
z.B:
Zeit 1: 15:34:23
Zeit 2: 15:37:29

Aus diesen beiden Zeiten muss ich sofort die Differenz in Sekunden ausgegeben bekommen.

Geht es evtl. mit der Methode:

computeTime()
Converts calendar field values to the time value (millisecond offset from the Epoch).

Wird doch in Millisekunden konvertiert, oder? dann kann ich halt mit Millisekunden rechnen.
Das blöde ist, dass es von der Grundzeit an errechnet wird. Das verfälscht das Ergebnis.(durch die Programmlaufzeit)

Ich weiß jedoch nicht, wie ich diese Methode einbinden soll, da ich mich mit Calendar field values noch nicht auskenne. Naja, werde mal ein bisschen weiter schaun.

Gruß,

Zeimen
 
Code:
   public static int calcSeconds( String time1, String time2 ) // hh:mm:ss
   {
      int h1, h2, m1, m2, s1, s2;
      String[] parts1 = time1.split( ":" ), parts2 = time2.split( ":" );
      h1 = Integer.parseInt( parts1[0] );
      h2 = Integer.parseInt( parts2[0] );
      m1 = Integer.parseInt( parts1[1] );
      m2 = Integer.parseInt( parts2[1] );
      s1 = Integer.parseInt( parts1[2] );
      s2 = Integer.parseInt( parts2[2] );

      int sec1 = h1 * 3600 + m1 * 60 + s1;
      int sec2 = h2 * 3600 + m2 * 60 + s2;

      return sec1 > sec2 ? sec1 - sec2 : sec2 - sec1;
   }

😳 aufgabenstellung nicht gelesen 😳 😳

#untested#
 
Was spricht gegen

Code:
GregorianCalendar cal1 = new GregorianCalendar();
cal1.set(Calendar.HOUR_OF_DAY, hour);
cal1.set(Calendar.MINUTE, min);
cal1.set(Calendar.SECOND, sec);
GregorianCalendar cal2 = new GregorianCalendar();
cal2.set(Calendar.HOUR_OF_DAY, hour2);
cal2.set(Calendar.MINUTE, min2);
cal2.set(Calendar.SECOND, sec2);
System.out.println("Dif: " + ((cal1.getTimeInMillis() - cal2.getTimeInMillis()) / 1000));

?
 
Das sieht schon mal sehr gut aus 😀 .

Bekomme aber leider eine Fehlermeldung.
Das java.util.*; habe ich auch schon importiert.
Auch wenn ich für hour eine beliebige Zahl angebe funktioniert es nicht.
Woran kann es liegen?

Fehlermeldung:

Fenster.java:21:9: <identifier> expected
cal1.set(Calendar.HOUR_OF_DAY, hour);
^
Fenster.java:21:30: <identifier> expected
cal1.set(Calendar.HOUR_OF_DAY, hour);
^
Fenster.java:21:36: <identifier> expected
cal1.set(Calendar.HOUR_OF_DAY, hour);
^
3 errors
 
klappt bei mir alles

#edit1
code kopieren -> einfügen -> java.util.Calendar und java.util.GregorianCalendar importieren -> ausführen -> klappt
 
Ui...das ging ja schnell. Wollte gerade schreiben, dass ich es schond das Problem gelöst habe.
Habs ausversehen in die falsche Klasse geschrieben. 😳
 
danke erstmal für eure bisherigen Antworten.

Gibt es eine Möglichkeit wenn ich 2 Strings in einem hh:mm:ss Format wie z.B. 18:34:54 und 18:37:32 habe, diese in ein Zeit-Objekt zu konvertieren, sodass ich die Zeitdifferenz in Sekunden oder Millisekunden vergleichen kann.
Gibt es denn dabei eine kürzere und einfachere Methode dieses zu machen als der GregorianCalendar?
Also direkt konvertieren und dann vergleichen?
 
Habe das erstmal so geschrieben. Weiss nicht, ob es funktioniert. Bekomme immer einen Laufzeitfehler. 🙁

Code:
for (int x = 1; x <=5; x++)
 {
 try
 {
  s = f[x].getText();
  date = datumsFormat.parse(s);
  cal[x].setTime(date);

  s = f[x].getText();
  date = datumsFormat.parse(s);
  cal[x+1].setTime(date);
  System.out.println("Dif: " + ((cal[x+1].getTimeInMillis() - cal[x].getTimeInMillis()) / 1000));
  differenz = cal[x+1].getTimeInMillis() - cal[x].getTimeInMillis();
  if(differenz < 300 && differenz < 0)
  {
    gdifferenz = differenz + gdifferenz;
  }

 }
 catch ( ParseException p )
 {
    p.printStackTrace();
 }

Ist natürlich nicht der ganze Quellcode.
Ich bekomme immer die Fehlermeldung Exception in thread "main" java.lang.NullPointerException.

Das liegt am objekt-array: TextField[] f = new TextField[5];

Es wird ja bei so einem Array immer mit dem Null-Wert initialisiert und der Konstruktor wird nicht ausgerufen.
Deshalb denke ich kommt diese Fehlermeldung zu stande.
Gibt es denn noch eine andere Möglichkeit ein Objekt-Array vom Textfield zu erstellen? :?:
Ich weiß auch nicht, ob das beim GregorianCalendar auch der Fall ist. :bahnhof:


Gruß,

Zeimen
 
poste mal plz den ganzen fehlerstack.

mit TextField[] f = new TextField[5]; wird ja nur platz für 5 JTextField-instanzen reserviert.
danach noch
Code:
for( int i = 0; i < 5; ++i )
    f[i] = new JTextField();
aufrufen, und die NPE würde meines erachtens wegfallen
und beim GregCal genauso 😉
 
Hier ist mein ganzer Quellcode:

Code:
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import java.text.*;


public class Daten extends Frame implements ActionListener //, WindowListener
{
 TextField[] f = new TextField[5];
 Button b1 = new Button("Berechnen");

 public Daten()
 {
   super("Datenbank");
   setLayout(null);
   setSize(250,300);
   setResizable(false);

  f[0].setBounds(100,50,100,20);
  add(f[1]);
  f[1].setBounds(100,100,100,20);
  add(f[2]);
  f[2].setBounds(100,150,100,20);
  add(f[3]);
  f[3].setBounds(100,200,100,20);
  add(f[4]);
  f[4].setBounds(100,250,100,20);
  add(f[4]);
  b1.setBounds(10,250,70,20);
  b1.addActionListener(this);
  add(b1);
  setVisible(true);
 }
 
 public void paint(Graphics g)
 {
   g.drawString("Zeit1",50,65);
   g.drawString("Zeit2",50,115);
   g.drawString("Zeit3",50,165);
   g.drawString("Zeit4",50,215);

 }
 public static void main(String[] args)
 {
  Daten d = new Daten();
 }
 
 public void actionPerformed(ActionEvent e)
 {

  String s = new String();
 Date date = new Date();
 SimpleDateFormat datumsFormat = new SimpleDateFormat ("HH:mm:ss");
 GregorianCalendar[] cal = new GregorianCalendar[5];
 long differenz = 0;
 long gdifferenz = 0;
 
 for (int x = 1; x <=5; x++)
 {
 try
 {
  s = f[x].getText();
  date = datumsFormat.parse(s);
  cal[x].setTime(date);


  s = f[x].getText();
  date = datumsFormat.parse(s);
  cal[x+1].setTime(date);
  //long s = cal2.getTimeInMillis()- cal1.getTimeInMillis();
  System.out.println("Dif: " + ((cal[x+1].getTimeInMillis() - cal[x].getTimeInMillis()) / 1000));
  differenz = cal[x+1].getTimeInMillis() - cal[x].getTimeInMillis();
  if(differenz < 300 && differenz < 0)
  {
    gdifferenz = differenz + gdifferenz;
  }
 }
 catch ( ParseException p )
 {
    p.printStackTrace();
 }
 }
 
 f[4].setText(" " +differenz);
}

}

Die Zeilennummerierung passt:
Der Fehlerstack beim Starten des Programmes ist:

Exception in thread "main" java.lang.NullPointerException
at Daten.<init>(Daten.java:19)
at Daten.main(Daten.java:45)



Wenn ich es so programmiere:

Code:
TextField[] f = new TextField[5];
 f[0] = new TextField();

Bekomme ich den Fehler schon beim compilieren:

Daten.java:10:4: ']' expected
f[0] = new TextField();
^
Daten.java:10:13: invalid method declaration; return type required
f[0] = new TextField();
^
2 errors
 
Du mußt die TextFields im Konstruktor initialiseren:

Code:
Daten() {
  ...
  setResizable(false);
  for (int i=0; i < f.length; i++)
    f[i] = new TextField();
  ...
}
 
Code:
public Daten() 
{ 
   super("Datenbank"); 
   setLayout(null); 
   setSize(250,300); 
   setResizable(false); 

  for( int i = 0; i < 5; ++i )
  {
     f[i] = new TextField();
     f[i].setBounds( 100, 50 * ( i + 1 ), 100, 20 );
     add( f[i] );
  }
  b1.setBounds(10,250,70,20); 
  b1.addActionListener(this); 
  add(b1); 
  setVisible(true); 
}

klappt :!:
 
mika.fhdw hat gesagt.:
Code:
...
  for( int i = 0; i < 5; ++i )
  ...

klappt :!:

aber ist schlecht.
Statt die Konstante 5 ein zweites Mal zu schreiben, sollte besser
Code:
 for( int i = 0; i < f.length; ++i )
geschrieben werden.
 
@Leroy42 hast ja recht...
weiterhin kann man da auch ne statische finale variable setzen und die ARRAY_LENGTH zum beispiel nennen...
da muss man das niemehr schreiben 😉

...aber ich hab vorausgesetzt, dass das so immer gemacht wird 😉... oder irr ich mich da?
 
jap 😀
aber auf statische wird schneller zugegriffen. und wenn die dann noch final sind, gehts noch schneller... hab ich mal irgendwo gelesen :###
 
danke für eure Antworten. habe mir sehr geholfen.
das mit dem Konstruktor habe ich noch nicht gewusst. :bahnhof:

Das Programm läuft soweit. Hab bloss nur noch nen komischen Laufzeitfehler:


Wenn ich in in Zeile 67

s = f[x].getText(); durch s = f[x+1].getText(); ersetze

..das Programm dann laufen lasse. Werte in die Felder eingebe und berechne, bekomme ich diese Fehlermeldung:

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Naja...muss leider noch viel in Java lernen
 
das geht ja schon mit der for-schleife los...

in java fangen alle zählwerte für arrays, listen, etc.. .mit 0 und nicht mit 1 an.
dann gibt es in deinem falle 5 einträge -> 0, 1, 2, 3, 4 und keinen mit index 5!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben