Time differenz schräg

Generic1

Top Contributor
Hallo,

meine Methode:

Java:
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
 

Generic1

Top Contributor
Besten Dank mal Andre,

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

Java:
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
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Versuch's mal so (ich bin allerdings nicht sicher, was Du willst):
Java:
    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

Top Contributor
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
 
S

Spacerat

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
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:
Java:
	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);
 

Generic1

Top Contributor
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

Java:
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
 

Generic1

Top Contributor
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

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

Hier Dein Beispiel:
Java:
		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
 
Zuletzt bearbeitet:

Generic1

Top Contributor
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

Top Contributor
Klar geht das.

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

André Uhres

Top Contributor
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.
 
Zuletzt bearbeitet:

Generic1

Top Contributor
Ich hab mir wieder mal ein Testprogramm geschrieben:

Java:
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
 
S

Spacerat

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:

Generic1

Top Contributor
Java:
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

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

Java:
...
        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...

Top Contributor
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:
Java:
	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

Top Contributor
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:
Java:
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());
 
Zuletzt bearbeitet:

Generic1

Top Contributor
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?
 

Generic1

Top Contributor
Hallo Andre,

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

Java:
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:

Code:
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,
 
S

Spacerat

Gast
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?
 
Zuletzt bearbeitet von einem Moderator:

André Uhres

Top Contributor
Wie ich oben bereits erklärt hatte, können wir die Zeitzone mit Hilfe der Klasse "Calendar" sehr leicht anpassen. Beispiel:
Java:
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:
Java:
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 ;).
 
Zuletzt bearbeitet:

Generic1

Top Contributor
Hallo Andre,

irgendwas mach ich noch falsch, ich habe folgenden Konstruktor:

Java:
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

Top Contributor
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.
 
S

Spacerat

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:

André Uhres

Top Contributor
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

Top Contributor
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

Java:
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

Top Contributor
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


Java:
calendar.setTimeInMillis(duration.getMillis());
 
S

Spacerat

Gast
Jeppp ;)
Java:
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

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

Gruß,
André

Java:
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();
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben