Chciałbym sformatować czas trwania w sekundach za pomocą wzorca takiego jak H: MM: SS. Obecne narzędzia w Javie są zaprojektowane do formatowania czasu, ale nie czasu trwania.
Chciałbym sformatować czas trwania w sekundach za pomocą wzorca takiego jak H: MM: SS. Obecne narzędzia w Javie są zaprojektowane do formatowania czasu, ale nie czasu trwania.
Jeśli używasz wersji Java starszej niż 8 ... możesz użyć Joda Time i PeriodFormatter
. Jeśli naprawdę masz czas trwania (tj. Czas, który upłynął, bez odniesienia do systemu kalendarza), prawdopodobnie powinieneś używać Duration
w większości - możesz wtedy zadzwonić toPeriod
(określając cokolwiek PeriodType
chcesz, aby odzwierciedlić, czy 25 godzin stanie się 1 dzień i 1 godzinę lub nie itd.), Aby uzyskać plik, Period
który można sformatować.
Jeśli używasz Java 8 lub nowszej: zwykle sugeruję użycie java.time.Duration
do reprezentowania czasu trwania. Następnie możesz wywołać getSeconds()
lub coś podobnego, aby uzyskać liczbę całkowitą do standardowego formatowania ciągu, zgodnie z odpowiedzią bobince, jeśli potrzebujesz - chociaż powinieneś uważać na sytuację, w której czas trwania jest ujemny, ponieważ prawdopodobnie chcesz mieć pojedynczy znak ujemny w ciągu wyjściowym . Więc coś takiego:
public static String formatDuration(Duration duration) {
long seconds = duration.getSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
absSeconds / 3600,
(absSeconds % 3600) / 60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
Formatowanie w ten sposób jest dość proste, choć irytująco ręczne. W przypadku analizowania jest to ogólnie trudniejsze ... Jeśli chcesz, nadal możesz używać Joda Time nawet z Javą 8, jeśli chcesz.
Duration
metody S:duration.toHours()
,duration.toMinutesPart()
iduration.toSecondsPart()
które są dostępne od Java 9. I aby uzyskać jedną wartość bezwzględna może używaćduration.abs()
.Jeśli nie chcesz przeciągać bibliotek, wystarczy samemu zrobić to za pomocą programu Formatter lub powiązanego skrótu, np. podana całkowita liczba sekund s:
źródło
s/86400, (s%86400)/3600...
na kilka dni, jeśli to konieczne ...s > 8640
0 (jeden dzień):"\u221E"
- nieskończonośćUżywam DurationFormatUtils Apache common w następujący sposób:
źródło
Jest to łatwiejsze, ponieważ Java 9. A
Duration
nadal nie jest formatowalna, ale dodawane są metody pobierania godzin, minut i sekund, co czyni zadanie nieco prostszym:Wynik tego fragmentu kodu to:
źródło
źródło
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
przed użyciemformat
funkcji.To może być trochę hakerskie, ale jest dobrym rozwiązaniem, jeśli ktoś chce to osiągnąć za pomocą Java 8
java.time
:źródło
Duration.ofSeconds(20)
), OtrzymałemUnsupportedTemporalTypeException
). Po prostu usunąłem kod, sprawdzając, czy różnica jest== 01
. Pomyślałem, że jest01
to jakaś wartość maskująca, której nie do końca rozumiem, czy możesz to wyjaśnić?isSupported
metodę, zwraca informacje, jeśli istnieje prawidłowe pole do wyświetlenia w ciągu czytelnym dla człowieka. W każdym razie „maskowanie” w rzeczywistości nie jest maską. Kod pokazuje, żereturn value!=0l
niereturn value!=01
. Następnym razem skorzystaj z opcji kopiuj-wklej.TemporalAccessor
nie powinien być nadużywany przez określony czas. JSR-310 zaprojektował interfejsTemporalAmount
do tego celu.L
do oznaczanialong
wartości. Tak łatwo jest błędnie odczytać małe literyl
dla cyfry 1, jak właśnie pokazano.Oto jeszcze jeden przykład formatowania czasu trwania. Zauważ, że ta próbka pokazuje zarówno pozytywny, jak i negatywny czas trwania jako pozytywny czas trwania.
źródło
Ta odpowiedź używa tylko
Duration
metod i działa z Javą 8:źródło
A co z następującą funkcją, która zwraca + H: MM: SS lub + H: MM: SS.sss
źródło
Istnieje dość proste i eleganckie (IMO) podejście, przynajmniej przez okres krótszy niż 24 godziny:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
Elementy formatujące potrzebują obiektu czasowego do sformatowania, więc możesz go utworzyć, dodając czas trwania do LocalTime równego 00:00 (tj. Północ). To da ci LocalTime reprezentujący czas trwania od północy do tego czasu, który można następnie łatwo sformatować w standardowej notacji GG: mm: ss. Ma to tę zaletę, że nie wymaga zewnętrznej biblioteki i do obliczeń używa biblioteki java.time zamiast ręcznego obliczania godzin, minut i sekund.
źródło
To działa opcja.
Wywołaj metodę za pomocą
Produkuje coś takiego:
źródło
źródło
używając tej funkcji
źródło
Moja biblioteka Time4J oferuje rozwiązanie oparte na wzorcach (podobne do
Apache DurationFormatUtils
, ale bardziej elastyczne):Ten kod demonstruje możliwości obsługi przepełnienia godzin i obsługi znaków, zobacz także interfejs API programu formatującego czas trwania oparty na wzorcu .
źródło
W scali (widziałem kilka innych prób i nie byłem pod wrażeniem):
Wygląda okropnie, tak? Cóż, dlatego używamy IDE do pisania tych rzeczy, aby wywołania metod (
$toHoursPart
itp.) Miały inny kolor.Jest
f"..."
to interpolator ciągów w styluprintf
/String.format
(który umożliwia działanie$
wstrzyknięcia kodu). Biorąc pod uwagę wynik1 14:06:32.583
,f
interpolowany ciąg byłby równoważnyString.format("1 %02d:%02d:%02d.%03d", 14, 6, 32, 583)
źródło
W Scali, opierając się na rozwiązaniu YourBestBet, ale uproszczonym:
źródło
w scali, biblioteka nie jest potrzebna:
źródło
Nie widziałem tego, więc pomyślałem, że go dodam:
Działa tylko przez 24 godziny, ale zwykle tego chcę.
źródło