2011-07-21 7 views
15

W mojej aplikacji internetowej data & czas aktywności użytkownika jest przechowywany (w bazie danych) jako znacznik czasu Long, który po wyświetleniu użytkownikowi musi zostać przekonwertowany na zwykły format daty/godziny .Konwertuj datownik z długim na normalny format daty

(Faktycznie moja baza Cassandra przechowuje znacznik czasu, gdy kolumna został napisany do niego, jak długi Wartość (mikrosekund od 1970 roku), który będę używać, aby dowiedzieć się czas odpowiadająca aktywności użytkownika)

Używam JSF 2.0 (+ primefaces), który moim zdaniem ma konwertery, które mogą być pomocne w tej konwersji? Lub w inny sposób, w jaki sposób mogę w najlepszym wypadku osiągnąć te konwersje?

+0

ja nic o tym wiedzieć Cassandra , więc tutaj jest tylko pęd w ciemności: Zastanawiam się, czy 'PreparedStatement # setTimestamp()' i 'ResultSet # getTimestamp()' nie działa dla ciebie? Zobacz także odpowiedź na podobne pytanie, które napisałem przedtem: http://stackoverflow.com/questions/6778558/how-can-i-set-the-global-default-date-format-in-java With a fullworthy Obiekt 'java.util.Date' można po prostu użyć standardowych konwerterów daty/czasu JSF, takich jak' 'po stronie widoku w zwykły sposób konwertowania między nim a czytelną dla człowieka reprezentacją napisów. – BalusC

+1

@BalusC: nie jest Cassandra jest jedną z tych baz danych "BigTable" lub "NoQuery', które korzystają z Facebooka lub Twittera. Słyszałem, że bardzo różnią się od zwykłego DB. @Raj, ponieważ 'PreparedStatement # setTimestamp() i ResultSet # getTimestamp()' mogą nie działać dla ciebie, umieszczam dla ciebie rozwiązanie wyższej warstwy. –

Odpowiedz

45

Pozwól mi zaproponować Ci to rozwiązanie. Więc w zarządzanym fasoli, zrób to

public String convertTime(long time){ 
    Date date = new Date(time); 
    Format format = new SimpleDateFormat("yyyy MM dd HH:mm:ss"); 
    return format.format(date); 
} 

więc na swojej stronie JSF, można to zrobić (zakładając foo jest obiekt, który zawiera Twój time)

<h:dataTable value="#{myBean.convertTime(myBean.foo.time)}" /> 

Jeśli masz wiele stron, które mają być Aby skorzystać z tej metody, możesz umieścić ją w pliku abstract class i mieć zarządzany komponent bean rozszerzający tę abstract class.

EDIT: Czas powrotu z TimeZone

niestety, myślę SimpleDateFormat zawsze sformatować czas w czasie lokalnym, więc możemy użyć SimpleDateFormat więcej. Tak aby wyświetlać czas w innej strefy czasowej, co możemy zrobić, to

public String convertTimeWithTimeZome(long time){ 
    Calendar cal = Calendar.getInstance(); 
    cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
    cal.setTimeInMillis(time); 
    return (cal.get(Calendar.YEAR) + " " + (cal.get(Calendar.MONTH) + 1) + " " 
      + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" 
      + cal.get(Calendar.MINUTE)); 

} 

Lepszym rozwiązaniem jest wykorzystanie JodaTime. Moim zdaniem ten interfejs API jest znacznie lepszy niż Kalendarz (lżejszy, szybszy i zapewnia większą funkcjonalność). Dodatkowo z January jest 0, który wymusza na programistce dodanie do wyniku 1, a sam musisz sformatować czas. Używając JodaTime, możesz to wszystko naprawić. Popraw mnie, jeśli się mylę, ale myślę, że JodaTime jest wbudowany w JDK7

+1

Dzięki! mógłbyś również dać mi znać, w jaki sposób mogę przekonwertować (zwiększyć/zmniejszyć) zgodnie z lokalną strefą czasową użytkownika. –

+0

@Raj: Zaktualizowałem moją odpowiedź. –

+1

Istnieje [JSR-310] (http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen), proponowana wystandaryzowana biblioteka podobna do Joda-Time, która pojawi się w przyszłym JDK, ale nie Zrób to w JDK 7. – Rup

1

Nie wiem, czy JSF zapewnia wbudowana funkcjonalność, ale można użyć konstruktora java.sql.Date „s przekonwertować na obiekt Date: http://download.oracle.com/javase/1.5.0/docs/api/java/sql/Date.html#Date(long)

to powinieneś być w stanie stosować wyższe funkcje poziomu świadczonych przez Java SE, Java EE, aby wyświetlić i sformatować wyodrębnioną datę. Można utworzyć instancję java.util.Calendar i jawnie ustawić godzinę: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#setTime(java.util.Date)

EDYCJA: Komponenty JSF nie powinny zajmować się konwersją. Twoja warstwa dostępu do danych (warstwa trwałości) powinna o to zadbać. Innymi słowy, komponenty JSF nie powinny obsługiwać atrybutów pisanych na maszynie long, ale tylko atrybuty maszynowe o typie Date lub .

0

Aby wyświetlić zera wiodące przed godzinami, minutami i sekundami, użyj poniżej zmodyfikowanego kodu.Sztuką jest tu jesteśmy konwersji (lub dokładniej formatowania) całkowitą w ciąg tak, że znajdują się zerem, gdy dotyczy:

public String convertTimeWithTimeZome(long time) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
     cal.setTimeInMillis(time); 
     String curTime = String.format("%02d:%02d:%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND)); 
     return curTime; 
    } 

wynik byłby podobny: 00:01:30