Zeit formatieren

Ich vor ner geraumen Zeit schon einmal nen Thema dazu aufgemacht, das eigentlich auch gelöst war. Nur war mein Problem das die Methode nur eine zweistellige Stundenzahl anzeigen konnte. Jetzt wollte ich das mal angehen und hab das so abgeändert:


    public static void main(String[] args) {
        System.out.println(new ZeitTest().formatTime(System.currentTimeMillis()));
    }

    public String formatTime(long milliseconds) {
        SimpleDateFormat sdf = null;
        String dauer = "mm:ss";
        long stunden = TimeUnit.MILLISECONDS.toHours(milliseconds);
        long minuten = TimeUnit.MILLISECONDS.toMinutes(milliseconds);
        long sekunden = TimeUnit.MILLISECONDS.toSeconds(milliseconds);
        System.out.println(stunden);
        System.out.println(minuten);
        System.out.println(sekunden);
        System.out.println(getLength(stunden));
        if (stunden > 0) {
            dauer = "H:" + dauer;
        }
        StringBuilder sb = new StringBuilder(dauer);
        long length = getLength(stunden);
        for (int i = 1; i < length; i++) {
            sb.insert(0, "H");
        }
        dauer = sb.toString();
        System.out.println(dauer);
        sdf = new SimpleDateFormat(dauer);
        sdf.setTimeZone(TimeZone.getTimeZone("EN"));
        Date date = new Date(milliseconds);
        return sdf.format(date);
    }

    public long getLength(long i) {
        return (long) Math.log10(i) + 1;
    }
}```
Ausgabe:

> 383244
> 22994649
> 1379678944
> 6
> HHHHHH:mm:ss
> 000012:09:04

Warum formatiert er zwar richtig die Stunden, aber gibt nur ne Zweistellige Stundenzahl an, die nach der erste Ausgabe sogar falsch ist...

die Millisekunden geben einen Zeitstempel an, heute, 14:09:04 in Deutschland, 12:09:04 in England,
bei Sommerzeit sind zwei Stunden Abstand, im Winter nur eine,

die Gesamtzahl der Stunden kann man offensichtlich ausrechnen,
aber SimpleDateFormat hat damit weder an sich etwas am Hut,
noch kann man es dahin hinbiegen, egal wieviele Hs du aneinanderreihst

Aus der Doku vom Formatter

‚H‘ Hour of the day for the 24-hour clock, formatted as two digits with a leading zero as necessary i.e. 00 - 23.

Also ist es egal wieviele H du davor setzt der Wert wird nur zwischen 0 und 23 formatiert.

[QUOTE=Schesam]383244
22994649
1379678944
6
HHHHHH:mm:ss
000012:09:04 [/QUOTE]

der Rest von 22994649/24 wird 12 sein, der Rest von 1379678944/60 wird 9 sein, uswusf.

Und wie krieg ich es dann hin, das er Alle Stunden anzeigt?

naja wieso nicht einfach so wie du sie vorher ausgerechnet hast? mit long stunden = TimeUnit.MILLISECONDS.toHours(milliseconds);

man kann einen String aus Zahlen und Doppelpunkt in Anführungszeichen usw. ganz manuell zusammenbauen :wink:

Hi,

hab zwar das Problem nicht so 100% verstanden (bzw. die Zweckmäßigkeit) … aber vielleicht hilft ja folgendes:

        long hours = TimeUnit.MILLISECONDS.toHours(millis.longValue());
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis.longValue());
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis.longValue());

        if (minutes > 0) {
            seconds -= minutes * 60;
        }
        if (hours > 0) {
            minutes -= hours * 60;
        }

        if (hours <= 0) {
            if (minutes <= 0) {
               return String.format("%d sec (%d ms)", seconds, millis);
            } else  {
               return String.format("%d min %d sec ", minutes, seconds);
            }
        } else {
            return String.format("%d h %d min %d sec ", hours, minutes, seconds);
        }
    }```

Gruß

kleine Stilkritik:

if (hours <= 0 && minutes <= 0) {
} else if (minutes > 0 && hours <= 0) {

beides ist hours <= 0, das ruhig mit gleicher Reihenfolge der Bedingungen betonen,

da das andere der if und else-Fall zu Minuten ist, hat Verschachtelung auch gewisse Vorteile:

if (hours <= 0) {
   if (minutes <= 0) {
      ..
   } else {
      ..
   }
} else  {
..
}

verdammt, erwischt :slight_smile:
hab es entsprechend geändert, danke für den Tipp…

wenn ich auch mal was vorschlagen darf:

		millis &= Long.MAX_VALUE;
		int t = (int) millis % 1000;
		millis /= 1000;
		int s = (int) millis % 60;
		millis /= 60;
		int m = (int) millis % 60;
		millis /= 60;
		int h = (int) millis;
		int size = Math.max(2, (int) Math.ceil(Math.log10(h)));
		stringTime = String.format("%0" + size + "d:%02d:%02d.%03d", h, m, s, t);
	}```