You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求类似Messenger的timeInMills转24小时制/日期格式实现源码

Messenger风格时间戳格式化实现方案

绝对有!我之前做即时通讯应用的时候刚好踩过类似的需求,专门实现了一套贴合Messenger风格的时间格式化逻辑,下面给你完整的实现方案:

核心逻辑梳理

我们需要先判断目标时间戳与当前时间的间隔:

  • 当间隔不足24小时时,仅显示24小时制的时分(如16:15)
  • 当间隔超过24小时时,显示星期缩写 + at + 24小时制时分(如THU at 16:15)

Java/Android 代码实现

这是最常用的移动端聊天应用技术栈实现,注释清晰,直接复用即可:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

public class MessengerTimeFormatter {

    // 格式化毫秒时间戳为Messenger风格字符串
    public static String formatMessengerTime(long timeInMillis) {
        // 获取当前时间日历实例(可指定时区,比如UTC)
        Calendar currentCal = Calendar.getInstance();
        currentCal.setTimeZone(TimeZone.getDefault()); // 替换为TimeZone.getTimeZone("UTC")可统一时区

        // 目标时间日历实例
        Calendar targetCal = Calendar.getInstance();
        targetCal.setTimeInMillis(timeInMillis);
        targetCal.setTimeZone(currentCal.getTimeZone());

        // 计算时间差(单位:天)
        long timeDiffMs = currentCal.getTimeInMillis() - timeInMillis;
        long daysDiff = timeDiffMs / (24 * 60 * 60 * 1000);

        SimpleDateFormat timeFormatter;
        if (daysDiff < 1) {
            // 不足24小时:仅显示24小时制时分
            timeFormatter = new SimpleDateFormat("HH:mm", Locale.ENGLISH);
        } else {
            // 超过24小时:星期缩写 + at + 时分
            timeFormatter = new SimpleDateFormat("EEE 'at' HH:mm", Locale.ENGLISH);
        }

        return timeFormatter.format(targetCal.getTime());
    }

    // 测试用例
    public static void main(String[] args) {
        // 测试3小时前的时间(不足24小时)
        long recentTime = System.currentTimeMillis() - 3 * 60 * 60 * 1000;
        System.out.println(formatMessengerTime(recentTime)); // 输出示例:14:22

        // 测试25小时前的时间(超过24小时)
        long pastTime = System.currentTimeMillis() - 25 * 60 * 60 * 1000;
        System.out.println(formatMessengerTime(pastTime)); // 输出示例:WED at 13:22
    }
}

关键注意事项

  • 时区适配:如果你的应用是全球化产品,建议统一使用UTC时区,避免不同地区用户看到的时间不一致
  • 多语言支持:修改Locale.ENGLISH为对应地区的Locale即可切换语言,比如Locale.CHINESE会显示周三 at 14:22
  • 其他语言实现思路:
    • Kotlin:直接复用上述Java类,或者用Kotlin的DateTimeFormatter简化实现
    • Swift:使用DateFormatter,通过Calendar.current.isDateInToday()判断是否显示日期,再设置对应的dateFormat

内容的提问来源于stack exchange,提问作者user8724610

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:23:54