Java 将时间戳长度转换为正常日期格式

Java 将时间戳长度转换为正常日期格式,java,jsf,primefaces,Java,Jsf,Primefaces,在我的web应用程序中,用户特定活动的日期和时间以时间戳Long的形式存储(在数据库中),在显示回用户时,需要将其转换为正常的日期/时间格式 (实际上,我的数据库Cassandra将列写入时的时间戳存储为一个长值(自1970年起为微秒),我将使用该值查找相应用户活动的时间) 我使用的是JSF2.0(+primefaces),我相信它有可能有助于这种转换的转换器?否则,我怎样才能实现这些转换呢 不确定JSF是否提供内置功能,但可以使用java.sql.Date的构造函数转换为日期对象: 然后,您应

在我的web应用程序中,用户特定活动的日期和时间以时间戳
Long
的形式存储(在数据库中),在显示回用户时,需要将其转换为正常的日期/时间格式

(实际上,我的数据库Cassandra将列写入时的时间戳存储为一个长值(自1970年起为微秒),我将使用该值查找相应用户活动的时间)


我使用的是JSF2.0(+primefaces),我相信它有可能有助于这种转换的转换器?否则,我怎样才能实现这些转换呢

不确定JSF是否提供内置功能,但可以使用
java.sql.Date
的构造函数转换为日期对象:

然后,您应该能够使用JavaSE、JavaEE提供的更高级功能来显示和格式化提取的日期。您可以实例化
java.util.Calendar
并显式设置时间:


编辑:JSF组件不应该负责转换。您的数据访问层(持久层)应该负责这一点。换句话说,JSF组件不应该处理
long
类型化属性,而应该只处理
Date
Calendar
类型化属性。因此,在托管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页面中,您可以这样做(假设
foo
是包含
time
的对象)


更好的解决方案是利用
JodaTime
。在我看来,这个API比日历好得多(重量更轻、速度更快、提供更多功能)。加上
Calendar.
1月的
Month
0
,这迫使开发人员将
1
添加到结果中,您必须自己设置时间格式。使用
JodaTime
,您可以修复所有这些问题。如果我错了,请纠正我,但我认为
JodaTime
包含在
JDK7

中,用于在修改后的代码中显示小时、分钟和秒之前的前导零。这里的诀窍是我们将整数(或更准确地格式化)转换为字符串,以便在适用时显示前导零:

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

java.time 上面的代码片段打印:

2017年11月4日05:01:18

“Noll”是12月份的盖尔语,所以这应该会让你的用户感到高兴。除了塔什干可能很少有讲盖尔语的人居住外,请自己指定用户的正确时区和地区

我是认真的,你从你的数据库得到了微秒。如果第二精度很好,您可以不保留micros,只使用一个arg
Instant.ofepochssecond()
,这将使代码缩短几行。由于
Instant
zoneDateTime
确实支持纳秒精度,因此我发现保持时间戳的完整精度是最正确的。如果时间戳的单位是毫秒而不是微秒(通常是微秒),则可以使用
Instant.ofEpochMilli()

当7年前提出这个问题时,使用
Date
Calendar
和/或
SimpleDateFormat
的答案很好。现在这些类都已经过时很久了,我们在
java.time
这一现代java日期和时间API中有了更好的表现

对于大多数使用,我建议您使用内置的本地化格式,就像我在代码中所做的那样。您可以尝试传递格式样式的
SHORT
LONG
FULL
。您甚至可以使用CalizedDateTime的重载方法分别指定日期和时间的格式样式。如果需要特定格式(这是在中提出的),您可以:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss, dd/MM/uuuu");
使用这个格式化程序,我们得到

2017年4月12日05:01:18


链接:解释如何使用
java.time

我尝试了这个方法并为自己工作

Date = (long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds

我对卡桑德拉一无所知,所以这里只是一个暗中猜测:我想知道
PreparedStatement\setTimestamp()
ResultSet\getTimestamp()
是否对你不起作用?另请参阅我在今天之前发布的一个类似问题的答案:使用fullworthy
java.util.Date
对象,您可以在视图端使用JSF标准日期/时间转换器,例如
,这是在它和人类可读的字符串表示之间转换的常用方式。@BalusC:Cassandra不是其中之一吗
BigTable
NoQuery
facebook或twitter使用的数据库。我听说这和普通的数据库有很大的不同@Raj,由于
PreparedStatement#setTimestamp()和ResultSet#getTimestamp()
可能对您不起作用,我为您发布了更高层的解决方案。谢谢!您还可以告诉我如何根据用户的本地时区进行转换(递增/递减)。有一个建议的标准化Joda时间相似库将出现在未来的JDK中,但它没有进入JDK 7。@ThangPham JodaTime未纳入JDK7中。它被添加到JAVA SE 8中。秒时不提供前导0,分钟或小时是个位数。我修改了它,使它看起来像一个数字时钟。用户格式化以实现与以下相同的效果:String curTime=String.format(“%02d:%02d:%02d”、cal.get(Calendar.HOUR\u OF_DAY)、cal.get(Calendar.MINUTE)、cal.get(Calendar.SECOND));或者在评论中查看我的答案
    ZoneId usersTimeZone = ZoneId.of("Asia/Tashkent");
    Locale usersLocale = Locale.forLanguageTag("ga-IE");
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(usersLocale);

    long microsSince1970 = 1_512_345_678_901_234L;
    long secondsSince1970 = TimeUnit.MICROSECONDS.toSeconds(microsSince1970);
    long remainingMicros = microsSince1970 - TimeUnit.SECONDS.toMicros(secondsSince1970);
    ZonedDateTime dateTime = Instant.ofEpochSecond(secondsSince1970, 
                    TimeUnit.MICROSECONDS.toNanos(remainingMicros))
            .atZone(usersTimeZone);
    String dateTimeInUsersFormat = dateTime.format(formatter);
    System.out.println(dateTimeInUsersFormat);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss, dd/MM/uuuu");
Date = (long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds