将以毫秒为单位的时间转换为 24 小时/日期

Turning timeInMills to a 24hour/Date

是否有像 Messenger 应用程序那样将 timeInMills 转换为 24 小时/日期的源代码。当 timeInMills 低于 24 小时时,它会 return 像这样 16:15 但当它超过 24 小时时它会 return 像这样 THU at 16:15。我目前正在创建一个聊天应用程序,我想将其添加到我的应用程序中。

编辑

注意这一行:long last24hTimestamp = current - MILLISECONDS_PER_DAY;

我是代表 UTC 时间计算的。

要获取当地时间,您应该考虑时区。


所以基本上你必须计算时间戳 timeInMillis 是否在最近 24 小时内,然后使用一种格式,否则使用另一种格式。

这将帮助您:

public static final long MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;// In real app you should pre-calculate this value
public static final String RECENT_DATE_FORMAT = "HH:mm";
public static final String OLD_DATE_FORMAT = "E' at 'HH:mm";

public static String displayTime(long timestamp) {
  long current = System.getCurrentTimeMillis();
  long last24hTimestamp = current - MILLISECONDS_PER_DAY;

  if (timestamp > last24hTimestamp) {

   // Received message within a day, use first format
   SimpleDateFormat sdf = new SimpleDateFormat(RECENT_DATE_FORMAT);
   return sdf.format(new Date(timestamp));
  } else {
    // Message is older than 1 day. Use second format

  }

}

您应该注意的事项:

  1. 如果您的应用 运行 在多个地方

  2. ,请考虑使用 timezone/localization 进行解析
  3. 如果您正在使用 java 8,请尝试使用 DateTimeFormatter。它是线程安全的,您可以为每个日期格式使用一个静态实例,无需每次要格式化日期

  4. 时都初始化SimpleDateFormat

java.time

对于 Java 中的日期或时间,我推荐 java.time,现代 Java 日期和时间 API。

static DateTimeFormatter lessThan24HoursAgoFormatter 
        = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
static DateTimeFormatter moreThan24HoursAgoFormatter 
        = DateTimeFormatter.ofPattern("EEE 'at' HH:mm", Locale.ENGLISH);
static ZoneId zone = ZoneId.of("America/Yakutat");

public static String getDisplayString(long timeInMills) {
    ZonedDateTime dateTime = Instant.ofEpochMilli(timeInMills)
            .atZone(zone)
            .truncatedTo(ChronoUnit.MINUTES);
    ZonedDateTime currentTimeYesterday = ZonedDateTime.now(zone).minusDays(1);
    if (dateTime.isAfter(currentTimeYesterday)) {
        return dateTime.format(lessThan24HoursAgoFormatter);
    } else {
        return dateTime.format(moreThan24HoursAgoFormatter);
    }
}

运行刚刚

  • getDisplayString(1_525_402_083_258L) 返回 Thu at 18:48
  • getDisplayString(1_525_490_972_172L) 只返回 19:29

请把你想要的时区写在我放的地方America/Yakutat。我建议您插入检查以确保毫秒表示不超过一周前的时间,而不是未来的时间,因为在这些情况下返回的字符串会令人困惑。

也有可能存在一个库,它可以格式化类似于您想要的字符串。使用您的搜索引擎。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及新的 Android 设备上(据我所知,来自 API 级别 26)新的 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新的 类 的 backport(ThreeTen 用于 JSR 310,其中现代 API 首次被描述)。
  • 在(较旧的)Android 上,使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。确保从包 org.threeten.bp 和子包中导入日期和时间 类。

链接