在我的網絡應用程序中,日期&用戶的特定活動時間作爲時間戳Long
存儲(在數據庫中),其顯示回用戶需要轉換爲正常日期/時間格式。將時間戳長轉換爲正常日期格式
(其實我的數據庫Cassandra的存儲當一列被寫入到它的時間戳,作爲長值(微秒自1970年以來),我會用它來找出相應的用戶活動的時間)
我正在使用JSF 2.0(+ primefaces),我認爲它有轉換器可能有助於此轉換?否則,我怎麼能充其量地實現這些轉換?
在我的網絡應用程序中,日期&用戶的特定活動時間作爲時間戳Long
存儲(在數據庫中),其顯示回用戶需要轉換爲正常日期/時間格式。將時間戳長轉換爲正常日期格式
(其實我的數據庫Cassandra的存儲當一列被寫入到它的時間戳,作爲長值(微秒自1970年以來),我會用它來找出相應的用戶活動的時間)
我正在使用JSF 2.0(+ primefaces),我認爲它有轉換器可能有助於此轉換?否則,我怎麼能充其量地實現這些轉換?
讓我爲你提出這個解決方案。因此,在您的託管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.Month
的January
是0
,強制開發人員將1
添加到結果中,並且您必須自己格式化時間。使用JodaTime
,你可以修復所有這些。如果我錯了,請糾正我,但我認爲JodaTime
已納入JDK7
謝謝!你能否讓我知道如何根據用戶的本地時區來轉換(增加/減少)它。 –
@Raj:我更新了我的答案。 –
還有[JSR-310](http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen),一個擬定的標準化Joda-Time-like庫,將出現在未來的JDK中,但它沒有不會將其轉換爲JDK 7. – Rup
不知道如果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
類型的屬性,而只能處理Date
或Calendar
類型的屬性。
要顯示前幾小時,分和秒的盈方,請使用以下修改後的代碼。這裏的技巧是,我們正在轉換(或者更準確地格式化)整數轉換爲字符串,使其顯示前導零每當適用:
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
我一無所知卡桑德拉,所以這裏只是在黑暗中拍攝:我不知道'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
@BalusC:不是Cassandra是Facebook或Twitter使用的那些BigTable或NoQuery數據庫之一。我聽說這些與常規數據庫非常不同。 @Raj,因爲'PreparedStatement#setTimestamp()和ResultSet#getTimestamp()'可能不適合你,所以我會爲你發佈更高層的解決方案。 –