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

2022-09-01 16:28:19

在我的Web应用程序中,用户某些活动的日期和时间(在数据库中)存储为时间戳,在显示给用户时需要转换为正常的日期/时间格式。Long

(实际上,我的数据库Cassandra将列写入它的时间戳存储为长值(自1970年以来的微秒),我将用它来找出相应用户活动的时间)

我正在使用JSF 2.0(+素数),我相信它有可能有助于此转换的转换器?或者,否则我该如何实现这些转换?


答案 1

让我为您提出这个解决方案。因此,在受管理的 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 页面中,您可以执行此操作(假设对象包含footime)

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

如果您有多个页面想要使用此方法,则可以将其放入 a 中,并让受管 Bean 扩展此 。abstract classabstract class

编辑:返回时间与时区

不幸的是,我认为总是以本地时间格式化时间,因此我们无法再使用。因此,要在不同的时区显示时间,我们可以这样做SimpleDateFormatSimpleDateFormat

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

}

更好的解决方案是利用 .在我看来,这个API比日历好得多(重量更轻,速度更快,提供更多功能)。另外,是 ,迫使开发人员添加到结果中,并且您必须自己格式化时间。使用 ,您可以解决所有这些问题。如果我错了,请纠正我,但我认为JodaTimeCalendar.MonthJanuary01JodaTimeJodaTimeJDK7


答案 2

java.time

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

以上片段打印:

4 诺尔 2017 05:01:18

“Noll”是12月的盖尔语,所以这应该让你的用户满意。除了可能很少有讲盖尔语的人居住在塔什干,所以请自己指定用户的正确时区和区域设置。

我认真对待你从数据库中得到的微秒。如果秒精度很好,你可以不做,只使用 one-arg ,这将使代码缩短几行。由于并且确实支持纳秒精度,我发现保持时间戳的完整精度是最正确的。如果您的时间戳以毫秒为单位,而不是以微秒为单位(通常都是微秒),则可以只使用 。remainingMicrosInstant.ofEpochSecond()InstantZonedDateTimeInstant.ofEpochMilli()

使用 和/或的答案在 7 年前被问到这个问题时很好。今天,这些类都已经过时了,我们在现代Java日期和时间API方面要好得多。DateCalendarSimpleDateFormatjava.time

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

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss, dd/MM/uuuu");

改用这个格式化程序,我们得到

05:01:18, 04/12/2017

链接:Oracle教程:日期时间解释如何使用.java.time


推荐