在我的网络应用程序中,日期&用户的特定活动时间作为时间戳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()'可能不适合你,所以我会为你发布更高层的解决方案。 –