求类似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
- Kotlin:直接复用上述Java类,或者用Kotlin的
内容的提问来源于stack exchange,提问作者user8724610
相关产品推荐
相关产品推荐

