2015-06-27 12 views
5

Przede wszystkim jestem nowy w pakiecie java.time.Wydrukuj czas w formacie czytelnym dla człowieka przez EL

Piszę aplikację webową, która musi działać w określonych porach dnia i z kilkoma czasami trwania wydarzeń.

Więc napisałem swój kod używając klas LocalTime i Duration z pakietu java.time.

Kiedy potrzeba, aby uczynić ich wartość w JSP jest bardzo prosta dla LocalTime obiektu (bo .toString() zwraca czytelnej Vale), więc mogę tylko napisać ${startTime} i wszystko idzie w odpowiedni sposób (np jest renderowane jako 9:00). To samo podejście nie działa w przypadku Duration, ponieważ jego reprezentacja jest podobna do PT20M (w tym przypadku przez 20 minut).

Czy istnieje elegancki sposób na dokonanie konwersji czytelnej dla człowieka w JSP bezpośrednio przez EL?

Tak, wiem, że mogę przekonwertować obiekt w łańcuchu na moich zajęciach (przed JSP), ale szukam sugerowanego podejścia (którego nie mogę znaleźć) ... innym punktem jest to, że Nie widzę oficjalnej metody "przekonwertuj()" (lub jakiejkolwiek innej) w obiekcie Duration ... więc myślę, że używam niewłaściwego obiektu do odwzorowania czasu (dodawanie lub odejmowanie na s).

Dziękuję.

+1

Czy potrzebujesz sformatowanego tekstu w języku angielskim, a także w dowolnym innym języku (np. "1 Stunde und 20 Minuten" w języku niemieckim)? Jeśli ważne są inne języki, zalecam korzystanie z dodatkowej biblioteki stron trzecich. Java-8 nie zawiera żadnego wbudowanego formatowania czasu, patrz także poprawna odpowiedź @Erlandssona, która jest wystarczająca, jeśli potrzebujesz tylko formularza liczbowego. –

+0

Prawdę mówiąc, potrzebuję tylko 20 na 20 minut lub 1:20 na 1 godzinę i 20 minut ... nic wspólnego z lokalizacją, tylko ludzka czytelna forma ... –

Odpowiedz

5

Niestety nie istnieje elegancki sposób wbudowane do formatowania Duration w Javie 8. Najlepszym znalazłem jest użycie metody bobince opisuje this odpowiedź:

Duration duration = Duration.ofHours(1).plusMinutes(20); 
    long s = duration.getSeconds(); 
    System.out.println(String.format("%d:%02d:%02d", s/3600, (s%3600)/60, (s%60))); 

która drukuje:

1:20:00

kod będzie muszą być dostrojone, jeśli potrzebujesz dłuższych czasów.

Nie jestem pewien, co masz na myśli, mówiąc, że brakuje Ci metody convert, ale Duration dobrze nadaje się do dodawania/odejmowania na LocalTime. Metody jako argumenty przyjmują argumenty.

+0

Dziękuję ... Dokładnie używam czas trwania tylko do reprezentowania czasu trwania wydarzenia (tak, jeśli czas lokalny jest 9:00 i trwa 30 minut, mogę użyć tego, co napisałeś, aby uzyskać inny czas LocalTime jako sumę: 9:30). Mówiąc o czymś podobnym do metody "convert()", mówię tylko o braku metody konwersji obiektu Duration w reprezentacji String (to znowu jest temat pytania ... to tylko powtórzenie) . Tak poza tym...to jest bardzo dziwne, że nie mam taglib lub czegoś innego, aby zrobić to, czego potrzebuję do Duration, ale LocalTime wykonuje to po prostu przez toString() –

+0

Pod koniec zdecydowałem się stworzyć kolejną metodę get w mojej fasoli, która będzie używane na żądanie przez mój kod EL: napisałem '$ {item.myDurationStr}' zamiast '$ {item.myDuration}', a to "przekonwertuje" format, z kodem takim jak 'public String getMyDurationStr() {' ' long sec = myDuration.getSeconds(); ' ' return String.format ("% 02d:% 02d", s/3600, (s% 3600)/60); // Nie potrzebuję na sekundy ' '} ' –