2011-07-21 91 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

相关问题