2011-07-21 35 views
15

在我的網絡應用程序中,日期&用戶的特定活動時間作爲時間戳Long存儲(在數據庫中),其顯示回用戶需要轉換爲正常日期/時間格式。將時間戳長轉換爲正常日期格式

(其實我的數據庫Cassandra的存儲當一列被寫入到它的時間戳,作爲長值(微秒自1970年以來),我會用它來找出相應的用戶活動的時間)

我正在使用JSF 2.0(+ primefaces),我認爲它有轉換器可能有助於此轉換?否則,我怎麼能充其量地實現這些轉換?

+0

我一無所知卡桑德拉,所以這裏只是在黑暗中拍攝:我不知道'PreparedStatement#setTimestamp()'和'ResultSet#getTimestamp()'不適合你嗎?另請參見我在今天發佈的類似問題上的答案:http://stackoverflow.com/questions/6778558/how-can-i-set-the-global-default-date-format-in-java隨着一個完全適合'java.util.Date'對象,您可以在視圖中使用JSF標準日期/時間轉換器,例如'',這是通常的方法,可以在它與人類可讀的字符串表示之間進行轉換。 – BalusC

+1

@BalusC:不是Cassandra是Facebook或Twitter使用的那些BigTable或NoQuery數據庫之一。我聽說這些與常規數據庫非常不同。 @Raj,因爲'PreparedStatement#setTimestamp()和ResultSet#getTimestamp()'可能不適合你,所以我會爲你發佈更高層的解決方案。 –

回答

45

讓我爲你提出這個解決方案。因此,在您的託管bean,這樣做

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

所以在JSF頁面中,你可以做

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

如果您有想多頁本(包含您的time假設foo的對象)要利用這種方法,你可以把它放在abstract class中,讓你的託管bean擴展這個abstract class

編輯:返回時間與時區

不幸的是,我認爲SimpleDateFormat總是格式化本地時間的時間,所以我們可以使用SimpleDateFormat了。所以,以顯示不同的時區的時間,我們可以做到這一點

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)); 

} 

一個更好的解決方案是利用JodaTime。在我看來,這個API比Calendar更好(重量更輕,速度更快,功能更多)。加上Calendar.MonthJanuary0,強制開發人員將1添加到結果中,並且您必須自己格式化時間。使用JodaTime,你可以修復所有這些。如果我錯了,請糾正我,但我認爲JodaTime已納入JDK7

+1

謝謝!你能否讓我知道如何根據用戶的本地時區來轉換(增加/減少)它。 –

+0

@Raj:我更新了我的答案。 –

+1

還有[JSR-310](http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen),一個擬定的標準化Joda-Time-like庫,將出現在未來的JDK中,但它沒有不會將其轉換爲JDK 7. – Rup

1

不知道如果JSF提供了一個內置的功能,但你可以使用java.sql.Date的構造函數來轉換爲日期對象:http://download.oracle.com/javase/1.5.0/docs/api/java/sql/Date.html#Date(long)

那麼你應該能夠使用在Java SE提供更高級別的功能, Java EE顯示並格式化提取的日期。您可以實例化一個java.util.Calendar並明確設置時間:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#setTime(java.util.Date)

編輯:JSF組件不應該照顧轉換。你的數據訪問層(持久層)應該照顧這一點。換句話說,您的JSF組件不應該處理long類型的屬性,而只能處理DateCalendar類型的屬性。

0

要顯示前幾小時,分和秒的盈方,請使用以下修改後的代碼。這裏的技巧是,我們正在轉換(或者更準確地格式化)整數轉換爲字符串,使其顯示前導零每當適用:

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; 
    } 

結果會是這樣的:00:01:30

相關問題