# Time differenz schräg



## Generic1 (21. Nov 2011)

Hallo,

meine Methode: 


```
private void timediff() {
        Time t1 = new Time(System.currentTimeMillis());
        Time t2 = new Time(System.currentTimeMillis()+30000);

        final Time t3 = new Time(t2.getTime() - t1.getTime());

        final DateFormat dateFormat = DateFormat.getTimeInstance();
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        Time tt = new Time(t2.getTime() - t1.getTime());


        System.out.println("Das ist t3: " + t3 + ", " + tt);
        }
```

da kommt eine Differenz von 1h und 30s raus.
Ich weiß nicht wie ich das mit Java (ohne Joda) lösen kann.
Weiß jemand wie das geht?
lg


----------



## André Uhres (21. Nov 2011)

Hallo Generic1,

versuch's mal mit [c]System.out.println("Das ist t3: " + dateFormat.format(t3));[/c].
Gruß,
André


----------



## Generic1 (21. Nov 2011)

Besten Dank mal Andre, 

ich hab jetzt nochmal nachgesehen wie mein Sachverhalt ist, der schaut so aus:


```
package datetimetest;

import java.sql.Time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Main {

    public Main() {
        Time t1 = Time.valueOf("09:15:32");
        Time t2 = new Time(convertTimeToDate("2012-10-14 09:59:34.000").getTime());
        timediff(t1, t2);
        }

    protected static Date convertTimeToDate(final String measuredTimeString) {
        Date measuredDate = null;
        final SimpleDateFormat sdfToDate = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS" );
        try {
            measuredDate = sdfToDate.parse(measuredTimeString);
            }
        catch (ParseException ex) {
            System.out.println("Exception class TimemeasurementService, method saveMeasuredTime: " + ex);
            }
        return measuredDate;
        }

    private void timediff(Time t1, Time t2) {
        final Time t3 = new Time(t2.getTime() - t1.getTime());
        final DateFormat dateFormat = DateFormat.getTimeInstance();
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        Time tt = new Time(t2.getTime() - t1.getTime());
        final Time t4 = Time.valueOf(dateFormat.format(t3));
        System.out.println("Das ist t3: " + t3 + ", " + dateFormat.format(t3) + ", " + t4 + ", tt: " + tt);
        }

    public static void main(String[] args) {
        new Main();
        }
}
```

Da kommt entweder eine Stunde zu viel oder eine Stunde zu wenig raus.
Hättest du da noch eine Lösung, mir ist das resultat eher unverständlich.

Besten Dank,
lg
Generic1


----------



## André Uhres (22. Nov 2011)

Versuch's mal so (ich bin allerdings nicht sicher, was Du willst):

```
timediff(t1, transferDate(t1, t2));
...
private Time transferDate(final Time t1, final Time t2) {
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(t1);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(t2);
    cal2.set(Calendar.YEAR, cal1.get(Calendar.YEAR));
    cal2.set(Calendar.MONTH, cal1.get(Calendar.MONTH));
    cal2.set(Calendar.DAY_OF_MONTH, cal1.get(Calendar.DAY_OF_MONTH));
    return new Time(cal2.getTime().getTime());
}
```
Gruß,
André


----------



## Generic1 (22. Nov 2011)

Hallo Andre,

besten Dank mal für deine Hilfe, was ich erreichen will ist folgendes: 
Ich bekomme über einem WebService z.B.: folgendes als String:

Time1: 09:15:32
Time2: 2012-10-14 09:59:34.000

und möchte jetzt die Differenz zwischen diesen beiden Zeiten ausrechnen (das Datu 2012-10-14 ist mir also egal).

Wenn ich Time2-Time1 ausrechne, soll eben 00:44:03.000 herauskommen. 
Weißt du vielleicht, wie ich das am besten hinbekomme? 
lg
Generic1


----------



## Spacerat (22. Nov 2011)

Du musst erst einmal feststellen, aus welcher Zeitzone die Zeiten (GMT und MEZ wahrscheinlich) stammen bzw. mit welcher in den Instanzen der verschiedenen Klassen gearbeitet wird. [c]System.currentTimeMillis()[/c] läuft zumindest mit der im System eingestellten.


----------



## Michael... (22. Nov 2011)

Was genau soll denn am Ende rauskommen? Du benötigst ja eine Zeitdifferenz, bin mir nicht sicher ob Java da ein passendes Objekt dazu hat. Time bzw. Date sind ja Objekte für ein Datum.

Wenn es nur um die Ausgabe der Differenz geht:

```
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
	Calendar startDate = Calendar.getInstance();
	startDate.set(2012, 9, 14, 9, 15, 32);
	Calendar endDate = Calendar.getInstance();
	endDate.set(2012, 9, 14, 9, 59, 34);
	
	System.out.println(sdf.format(startDate.getTime()) + " Uhr");
	System.out.println(sdf.format(endDate.getTime()) + " Uhr");
	
	long delta = endDate.getTimeInMillis() - startDate.getTimeInMillis();
	long ms = delta%1000;
	delta /=1000;
	long sec = delta%60;
	delta /=60;
	long min = delta%60;
	delta /=60;
	
	System.out.printf("Die Differenz beträgt: %02d h %02d min %02d sec %02d ms", delta, min, sec, ms);
```


----------



## André Uhres (22. Nov 2011)

Generic1 hat gesagt.:


> das Datum 2012-10-14 ist mir also egal



In dem Fall ist meine Methode "transferDate" genau das Richtige. Durch die Überführung des Datums vom ersten zum zweiten Zeitwert wird das Datum 2012-10-14 belanglos.

Gruß,
André


----------



## Generic1 (23. Nov 2011)

Besten Dank für die Hilfe.
Jetzt hab ich aber noch ein eher schräges Problem,
Ich möchte die kmh berechnen, dazu mein naiver Ansatz


```
System.out.println("Das wird übergeben: " + timeDifferenceNetto + ", " + timeDifferenceNetto.getTime());
final float kmh = calculateKmh(runninglength, timeDifferenceNetto.getTime());

private float calculateKmh(final float runninglength, final Long timeDifferenceNetto)
            final float h = timeDifferenceNetto / (1000.0f * 60.0f * 60.0f);
            final float kmh = runninglength/h;
            return kmh;
            }
```

Ausgabe >>Das wird übergeben: 00:36:59, -1381000
Also es wird schon ein negativer Wert der Methode calculateKmh übergeben, das versteh ich nicht.
Die Java- Teit fängt ja am 01.01.1970 00:00:00.000 an und 36:59 ist dann von mir aus 01.01.1970 00:36:59.000. Wie da ein neg. Wert zustande kommt weiß ich nicht.

Wie kann ich dann die kmh ausrechnen?
Vielen Dank,
lg
Generic1


----------



## André Uhres (23. Nov 2011)

Generic1 hat gesagt.:


> Die Java-Zeit fängt ja am 01.01.1970 00:00:00.000 an


Das gilt für die Zeit davor und danach.


Generic1 hat gesagt.:


> Wie da ein neg. Wert zustande kommt weiß ich nicht.


Die Zeit davor ist negativ.

Gruß,
André


----------



## Generic1 (23. Nov 2011)

Also heißt das ich muss meinen Time- Type wieder in einen Date- Type umwandeln?
Ich hätte mir gedacht ich kann z.B.: die 36min und 59s einfach in Sekunden umwandeln und dann die kmh ausrechnen?
Wie könnte ich das am Besten lösen, Steh momentan ein bisschen auf dem Schlauch.
Besten Dank,
lg


----------



## turtle (23. Nov 2011)

Ich schlage vor für Date/Time-Rechnungen mal JodaTime-API anzuschauen.

Hier Dein Beispiel:

```
LocalTime time1 = new LocalTime(9, 15, 32);
		LocalTime time2 = new LocalTime(9, 59, 34);
		Period period = new Period(time1, time2);
		if (time1.isAfter(time2))
			period = new Period(time2, time1);
		PeriodFormatter formatter = PeriodFormat.getDefault();
		System.out.println("Dauer:"+formatter.print(period));
		//Dauer:44 Minuten und 2 Sekunden
```


----------



## Generic1 (23. Nov 2011)

Ich habe in meiner Datenbank (MySQL) den Type TIME und verwende momentan in Java java.sql.Time.
Kann ich da den Joda- Time Type irgendwie in den java.sql.Time type umwandeln? 

Ich hab eben bis jetzt alles mit Java- Bordmittel gemacht und möchte da nicht viel ändern!? 
lg


----------



## turtle (23. Nov 2011)

Klar geht das.


```
java.sql.Timestamp sqlTimeS = rs.getTimestamp("timestampField");
LocalDateTime localDateTime = new LocalDateTime(sqlTimeS.getTime());
```


----------



## André Uhres (23. Nov 2011)

Generic1 hat gesagt.:


> Also heißt das ich muss meinen Time- Type wieder in einen Date- Type umwandeln?



Nein, Du musst nur schauen wo das Datum herkommt, das vor 1970 liegt, dort nach der Ursache suchen und gegebenenfalls den Fehler beheben. 

Joda macht die Sache natürlich übersichtlicher, aber das wolltest Du ja nicht:


			
				Generic1 hat gesagt.:
			
		

> wie ich das mit Java (ohne Joda) lösen kann.



Gruß,
André

PS: mit [c]AbstractDateTime#toCalendar[/c] kannst Du von Joda nach standard Java konvertieren.
PS2: Wenn Du mit [c]new Timestamp(long time)[/c] einen neuen sql Timestamp anlegst, dann würde ich außerdem sicherheitshalber mit [c]timestamp.setNanos(0)[/c] die Nanos auf 0 setzen.


----------



## Generic1 (23. Nov 2011)

Ich hab mir wieder mal ein Testprogramm geschrieben: 


```
package timetest;

import java.sql.Time;
import java.text.DateFormat;
import java.util.TimeZone;

public class Main {

    public Main() {
        float km = 21.1f;

        final Time timeDifference = timediff();
        final long timeLong = timeDifference.getTime();
        System.out.println("#### Das ist die timeLong: " + timeLong + ", timeDifference: " + timeDifference);
        
        final String minPerKm = calculateMinPerKm(timeLong, km);
        System.out.println("-> " + minPerKm);
        }
    
    private Time timediff() {
        Time t1 = Time.valueOf("09:03:33");
        Time t2 = Time.valueOf("09:45:00");
        final Time t3 = new Time(t2.getTime() - t1.getTime());
        final DateFormat dateFormat = DateFormat.getTimeInstance();
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        return Time.valueOf(dateFormat.format(t3));
        }
   
    public static void main(String[] args) {
        final Main main = new Main();
        }
}
```

also ich versteh nicht, wo da das - herkommt, ich hab ja nur "Time"- Typen,
Vielleicht hat da jemand eine Ahnung?
lg


----------



## Spacerat (23. Nov 2011)

Hmm... also des würd' ich jetzt auch gern mal wissen, hab aber geringfügig 'ne Idee.
1. So wie du deine Time-Objekte instanzierst, wird die Systemzeitzone als Standard verwendet, unabhängig vom Datum, welches so der 1.1.1970 in MEZ sein dürfte.
2. [c]getTime()[/c] liefert lt. API aber stets ein long in GMT, deswegen wahrscheinlich negative Werte.
3. Dennoch müsste aber im Ergebnis [c]-timeB - (-timeA)[/c] wieder was positives herauskommen.
4. Möglicherweise verfälscht DateFormat die TimeZone erneut oder das zuletzt instanzierte Time-Objekt ist wieder in MEZ und bei der Wandlung in GMT passiert erneut, dass unter 2. gesagte.


----------



## turtle (23. Nov 2011)

> also ich versteh nicht, wo da das - herkommt,



Wo kommt was her? :bahnhof:

Ausser das calculateMinPerKm nicht definiert ist...


----------



## Generic1 (23. Nov 2011)

```
final String minPerKm = calculateMinPerKm(timeLong, km);
        System.out.println("-> " + minPerKm);
```

die 2 Zeilen einfach auskommentieren dann sieht man den Sachverhalt auch, wenn man das Programm laufen lässt, bekommt man eine negative Zahl für timeLong  und das weiß ich nicht wie ich das beheben kann?


----------



## Generic1 (23. Nov 2011)

Also mit Java- Bordmittel geht es mal nicht, da muss ich aufgeben.
Ich habs jetzt mit Joda probiert, das klappt ganz gut: 


```
...
        final Period period = jodaTest(t1, t2);
        calculateKmh(14.0, ?);
        }

     private float calculateKmh(final float runninglength, final Long timeDifferenceNetto) {
        System.out.println("## calcKmh: " + runninglength + ", " + timeDifferenceNetto);
        final float h = timeDifferenceNetto / (1000.0f * 60.0f * 60.0f);
        System.out.println("das ist h: " + h);
        final float kmh = runninglength/h;
        System.out.println("das ist kmh: " + kmh);
        return kmh;
        }
    
    private Period jodaTest(Time t1, Time t2) {
        LocalTime time1 = new LocalTime(t1.getTime());
        LocalTime time2 = new LocalTime(t2.getTime());
        Period period = new Period(time1, time2);
        if (time1.isAfter(time2))
            period = new Period(time2, time1);
        PeriodFormatter formatter = PeriodFormat.getDefault();
        System.out.println("Dauer:" + formatter.print(period));
        return period;
        }
```

Wie kann ich mit Joda die kmh ausrechnen, wäre euch nochmal sehr dankbar für hilfe,
lg
Generic1


----------



## Michael... (23. Nov 2011)

Verstehe die Problematik mit der negativen Zeit und die Schwierigkeit eine Geschwindkeit auszurechnen nicht.
Nochmal der Hinweis: Wenn man zwei Daten (Zeitpunkte) voneinander abzieht kommt eine Zeitdifferenz heraus und kein Datum. Wenn man diese Zeitdifferenz als das behandeln würde was sie ist und nicht als Datum als ein Time oder Date Objekt hätte man sicherlich keine Probleme:

```
public static void main (String[] args) {
	    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
	    Calendar startDate = Calendar.getInstance();
	    startDate.set(1969, 11, 31, 23, 59);
	    Calendar endDate = Calendar.getInstance();
	    endDate.set(1970, 0, 1, 1, 29);
	    
	    System.out.println(sdf.format(startDate.getTime()) + " Uhr " + startDate.getTimeInMillis());
	    System.out.println(sdf.format(endDate.getTime()) + " Uhr " + endDate.getTimeInMillis());
	    
	    long delta = endDate.getTimeInMillis() - startDate.getTimeInMillis();
	    System.out.printf("Die Differenz beträgt: %02d h %02d min %02d sec %02d ms\n", delta/3600000, delta/60000%60, delta/1000%60, delta%1000);
	    
	    float km = 33;
	    System.out.println("Durchschnittsgeschw. für eine Strecke von " + km + " km: " + (km*3600000d/delta) + " km/h");
	}
```


----------



## André Uhres (23. Nov 2011)

Generic1 hat gesagt.:


> also ich versteh nicht, wo da das - herkommt



Das kommt daher, weil 01:00:00 gemäß unserer Zeitzone mit 0 Millisekunden dargestellt wird, ist also korrekt.

Gruß,
André

PS: Falls du eine andere Zeitzone brauchst, das geht sehr einfach mit der Klasse "Calendar". Beispiel:

```
Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal1.clear();
cal1.set(1970, 0, 1, 9, 3, 33);
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal2.clear();
cal2.set(1970, 0, 1, 9, 45, 0);
cal2.setTimeInMillis(cal2.getTimeInMillis() - cal1.getTimeInMillis());
float km = 21.1f;
System.out.println("kmh = " + km * 3600000 / cal2.getTimeInMillis());
```


----------



## Generic1 (24. Nov 2011)

Also ich hab mich jetzt entschieden, dass ich das mit Joda mache, ich weiß nur nicht wie ich von der Joda- Duration wieder auf meinen java.sql.Time komme, damit ich das dann in der Datenbank speichern kann?


----------



## André Uhres (24. Nov 2011)

[c]new Time(duration.getMillis())[/c] ?


----------



## Generic1 (25. Nov 2011)

Hallo Andre,

das hab ich jetzt probiert, wenn ich das mache, dann bekomm ich wieder die 1h dazu


```
final Duration duration = timeDifference(t1, t2);
        System.out.println("### " + duration + ", " + new Time(duration.getMillis()));
        float kmh = calculateKmh(10.67f, duration.getMillis());
        System.out.println("############# kmh: " + kmh);
```

Da bekomm ich dann folgenden output: 


```
Dauer:22 minutes
### PT1320S, 01:22:00
```

Da hab ich die Stunde, die ich nicht will, wieder dabei. Das ist fast zum verzweifeln.
Könntet Ihr mir da nochmal einen Tipp geben wie ich das ohne die eine Stunde hinbekomme?

Besten Dank,


----------



## Spacerat (25. Nov 2011)

Okay, diese SQL-Klassen Date, Time und Timestamp haben's echt... Allesamt Erweiterungen der Klasse [c]java.util.Date[/c] und diese ist bekanntlich bis auf wenige Methoden Deprecated. Zeit und Datum werden als *long* in einer Membervariable *fastTime* abgelegt und wann immer diese Zeit zu einer Ausgabe oder ähnlichem kommen soll, wird fröhlich gewandelt (normalisiert XD) und eine weitere Membervariable *cdate*, zum Zeichen dass bereits gewandelt wurde, gesetzt. Irgendwie finde ich auch keine Möglichkeit, hier irgendwo eine Zeitzone zu setzen, was eigentlich nur ein schlechter Witz sein kann. Mir scheint, dass beim Instanzieren der Klassen von der Lokalzeit ausgegangen wird und bei der Ausgabe strikt GMT verwendet wird oder auch anders herum ???:L. Sind diese Klassen überhaupt noch irgendwie zu gebrauchen? Gibt es dafür irgendwelche Konventionen mit der sie brauchbar werden könnten?


----------



## FArt (25. Nov 2011)

Generic1 hat gesagt.:


> Ich habe in meiner Datenbank (MySQL) den Type TIME...
> lg



Das ist das Problem...



Spacerat hat gesagt.:


> Sind diese Klassen überhaupt noch irgendwie zu gebrauchen?


Oft nicht sinnvoll. Diese Klassen waren von Anfang an ein Designfehler. Deswegen gibt es ja Joda und JSR 310.


----------



## FArt (25. Nov 2011)

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0162fcd9195a970d-pi


----------



## Generic1 (25. Nov 2011)

Was schlagt ihr dann vor? 
Soll ich einen JODA- Datentyp in der DB speichert? Geht das überhaupt?


----------



## Generic1 (25. Nov 2011)

FArt hat gesagt.:


> Das ist das Problem...
> 
> 
> Oft nicht sinnvoll. Diese Klassen waren von Anfang an ein Designfehler. Deswegen gibt es ja Joda und JSR 310.



Welchen Typ würdest du dann in der MySQL- Datenbank anlegen? Es muss ja fast TIME sein wenn ich nur eine Zeit speichere, oder hast du da einen anderen Vorschlag? 

lg


----------



## FArt (25. Nov 2011)

Entweder die parsbare Zeit als Text (wohldefinierter Parser) oder ein int... ms (oder ns) seit 0 Uhr.... oder...

Für Hibernate ist schon alles fertig, aber man kann sich hier auch einfach nur Ideen holen..

Joda-Time Hibernate - Java date and time API - Hibernate support - User Guide


----------



## André Uhres (25. Nov 2011)

Wie ich oben bereits erklärt hatte, können wir die Zeitzone mit Hilfe der Klasse "Calendar" sehr leicht anpassen. Beispiel:

```
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(duration.getMillis());
```
Mit [c]calendar.get(Calendar.MILLISECOND)[/c] bekommen wir jetzt die Millisekunden in GMT:

```
System.out.println("### " + duration + ", " + new Time(calendar.get(Calendar.MILLISECOND)));
```

Gruß,
André

PS: Alternativ können wir die Zeit als sql Timestamp speichern, der am 1.1.1970 beginnt. Damit entfällt das Problem mit der Zeitzone .


----------



## Generic1 (25. Nov 2011)

Hallo Andre,

irgendwas mach ich noch falsch, ich habe folgenden Konstruktor: 


```
public Main() {
        Time t1 = Time.valueOf("09:15:32");
        Time t2 = new Time(convertTimeToDate("2012-10-14 09:37:32.000").getTime());

        final Duration duration = timeDifference(t1, t2);
        System.out.println("### " + duration + ", " + new Time(duration.getMillis()));
        float kmh = calculateKmh(10.67f, duration.getMillis());
        System.out.println("############# kmh: " + kmh);

        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        calendar.setTimeInMillis(duration.getMillis());
        System.out.println("### " + duration + ", " + new Time(calendar.get(Calendar.MILLISECOND)));
        }
```

da bekomm ich dann folgendes raus: 

Dauer:22 minutes
### PT1320S, 01:22:00
############# kmh: 29.1
### PT1320S, 01:00:00

also immer eine Stunde. Weißt du warum?
lg


----------



## turtle (25. Nov 2011)

Kannst Du mal mehr Code posten, damit ich auch die Imports sehen kann.

Jedenfalls kommt mir die Ausgabe "PT1320S" komisch vor, denn bei mir kommt als Ergebnis zwischen 09:15:32 und 09:37:32 eine Zeitdifferenz von PT22M heraus.

Weiterhin finde ich merkwürdig, das Du einmal nur die Uhrzeit, ein anderes mal aber auch ein Datum+Uhrzeit nimmst.


----------



## André Uhres (25. Nov 2011)

Das Beispiel ist in der Tat schwer nachvollziehbar. Besser wäre ein KSKB.

Gruß,
André


----------



## Spacerat (25. Nov 2011)

Also für mich genügt bereits wieder die Zeile 12... new Time und per System.out dessen toString-Methode... alles wieder durch irgend so eine TimeZone verfälscht.
@Andre: TimeStamp ist wohl leider auch keine Lösung (extends java.util.Date MAW: alles was diese Klasse implementiert, ist schlicht Schrott )

Warum ist denn diese Time-Klasse so wichtig? Muss man sie etwa irgendwo als Parameter übergeben, wenn man so etwas in die Datanbank schreiben will? Oder bekommt man solch ein Objekt zurück, wenn man daraus liest? Wenn nicht... Sch.... auf irgendwelche verunglückten API's und baue es dir selbst. Klingt hart, ist aber die Konsequenz. Vllt. kannst ja auch Datums- oder Zeitformate aus Joda verwenden. Bei simplen Tageszeiten würde ich mir allerdings schon gar keinen Kopf mehr machen, Zeiten in Millisekunden (long) verwenden, mit [c]% 86400000[/c] eingrenzen und als int in der Datenbank verwenden.

Vllt. klingt der Text jetzt ein bissl' angepi...t, aber was soll's... einfach nur schmunzeln - [c]java.util.Date[/c] ff. gehen mir reichlich auf den S...k.


----------



## André Uhres (26. Nov 2011)

Spacerat hat gesagt.:


> Warum ist denn diese Time-Klasse so wichtig? Muss man sie etwa irgendwo als Parameter übergeben, wenn man so etwas in die Datanbank schreiben will?



Es gibt in der Schnittstelle "java.sql.PreparedStatement" z.B. die Methoden "setTime" und "setTimeStamp" (mit und ohne Angabe der Zeitzone über ein Calendar Objekt). Dazu natürlich auch die entsprechenden Getter-Methoden in der Schnittstelle "java.sql.ResultSet".

Gruß,
André


----------



## Generic1 (26. Nov 2011)

Also mein kleines ausführbares Programm, ich hab deshalb einmal eine Time mit datum und einmal ohne da bei mir so der sachverhalt ausschaut. Mir würde es jetzt auch schon reichen, wenn ich eninfach die Period in einen String umwandeln könnte (diesen würd ich dann in der DB speichern) und diesen String dann wieder in eine Period umwandeln könnte.
Geht das irgendwie - oder wenn das untere Programm richtig funktionieren würde wärs auch super.
lg


```
package datetimetest;

import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.joda.time.LocalTime;
import org.joda.time.Period;

public class Main {

    public Main() {
        Time t1 = Time.valueOf("09:15:32");
        Time t2 = new Time(convertTimeToDate("2012-10-14 09:37:34.450").getTime());

        final Period duration = timeDifference(t1, t2);
        System.out.println("### " + duration);

        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
       calendar.setTimeInMillis(duration.getMillis());
        System.out.println("### " + duration + ", " + new Time(calendar.get(Calendar.MILLISECOND)));
        }

    private Period timeDifference(Time t1, Time t2) {
        LocalTime time1 = new LocalTime(t1.getTime());
        LocalTime time2 = new LocalTime(t2.getTime());
        Period period = new Period(time1, time2);
        if (time1.isAfter(time2))
            period = new Period(time2, time1);
        return period;
        }

    protected static Date convertTimeToDate(final String measuredTimeString) {
        Date measuredDate = null;
        final SimpleDateFormat sdfToDate = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS" );
        try {
            measuredDate = sdfToDate.parse(measuredTimeString);
            }
        catch (ParseException ex) {
            System.out.println("Exception class TimemeasurementService, method saveMeasuredTime: " + ex);
            }
        return measuredDate;
        }

    public static void main(String[] args) {
        new Main();
        }
}
```


----------



## Generic1 (26. Nov 2011)

Bin gerade draufgekommen, dass duration.getMillis() nicht die Zeit in millisekunden angibt sondern wirklich nur die millisekunden. 
Da müsste es eine andere Möglichkeit geben, von Duration auf Time umzuwandeln. 
Habt ihr vielleicht noch eine Idee?
lg



```
calendar.setTimeInMillis(duration.getMillis());
```


----------



## Spacerat (26. Nov 2011)

Jeppp 

```
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Time
extends java.sql.Time
{
	private static final long serialVersionUID = -6079606289735443821L;
	private static final IllegalArgumentException NOT_VALID = new IllegalArgumentException("not a valid timestring");
	private long value;

	public Time(long time)
	{
		super(-1l);
		setTime(time);
	}

	@Override
	public void setTime(long time)
	{
		time %= 86400000;
		if(time < 0) {
			time += 86400000;
		}
		value = time;
	}

	@Override
	public long getTime()
	{
		return value;
	}

	@Override
	public String toString()
	{
		long time = getTime();
		long hrs, mins, secs;
		time %= 86400000;
		time /= 1000;
		secs = Long.valueOf(time % 60);
		time /= 60;
		mins = Long.valueOf(time % 60);
		time /= 60;
		hrs = Long.valueOf(time);
		return String.format("%02d:%02d:%02d", hrs, mins, secs);
	}

	public static Time valueOf(String timeString)
	{
		String[] tmp = timeString.split(":");
		int min = Math.min(tmp.length, 3);
		long time = 0L;
		for(int n = 0; n < min; n++) {
			if(tmp[n].length() != 2) {
				throw NOT_VALID;
			}
			long split = Long.parseLong(tmp[n], 10);
			if(split < 0) {
				throw NOT_VALID;
			}
			switch(n) {
			case 0:
				if(split > 23) {
					throw NOT_VALID;
				}
				time += split * 3600;
				break;
			case 1:
				if(split > 60) {
					throw NOT_VALID;
				}
				time += split * 60;
				break;
			case 2:
				if(split > 60) {
					throw NOT_VALID;
				}
				time += split;
				break;
			}
		}
		return new Time(time * 1000);
	}

	public static void main(String[] args)
	{
		Time t1 = Time.valueOf("09:15:32");
		Date d1 = convertTimeToDate("2012-10-14 09:37:34.450");
		Time t2 = new Time(d1.getTime() - d1.getTimezoneOffset() * 60000);
		System.out.println(new Time(t2.getTime() - t1.getTime()));
	}

	private static Date convertTimeToDate(final String measuredTimeString)
	{
		Date measuredDate = null;
		final SimpleDateFormat sdfToDate = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS" );
		try {
			measuredDate = sdfToDate.parse(measuredTimeString);
		}
		catch (ParseException ex) {
			System.out.println("Exception class TimemeasurementService, method saveMeasuredTime: " + ex);
		}
		return measuredDate;
	}
}
```
Wenn's nicht so will, wie man es gerne hätte, dann erweitert man halt die schadhaften Klassen (hier Time) und überschreibt alles was verunglimpft ist aber benötigt wird - so was nennt sich Workaround. Wenn nötig verwendet man dabei auch noch Deprecated API. Des lässt sich auch so mit Date usw. machen.


----------



## André Uhres (26. Nov 2011)

Wenn Du nicht auf einen bestimmten Datentyp angewiesen bist, dann würde ich einfach bei Joda bleiben.

Gruß,
André


```
import org.joda.time.*;

public class Main {

    public Main() {
        LocalTime t1 = new LocalTime(9, 15, 32);
        LocalDateTime t2 = new LocalDateTime(2012, 10, 14, 9, 37, 34, 450);
        Period duration = timeDifference(t1, new LocalTime(t2));
        String durationStr = duration.toString();
        System.out.println("durationStr = " + durationStr);
        duration = new Period(durationStr);
        System.out.println("duration = " + duration);
    }

    private Period timeDifference(final LocalTime t1, final LocalTime t2) {
        Period period = new Period(t1, t2);
        if (t1.isAfter(t2)) {
            period = new Period(t2, t1);
        }
        return period;
    }

    public static void main(final String[] args) {
        Main main = new Main();
    }
}
```


----------

