Android中DateUtils.getRelativeTimeSpanString未返回相对时间问题
解决DateUtils.getRelativeTimeSpanString返回绝对日期而非相对时间的问题
我之前也踩过这个一模一样的坑!一眼就注意到你提到的时间戳示例1521759734——这个是秒级时间戳,但DateUtils.getRelativeTimeSpanString的前两个参数要求的是毫秒级的时间戳!这几乎肯定是你问题的根源。
问题分析
你说这个时间戳对应4小时前,但直接把这个秒数传入方法的话,它会被当成毫秒来解析,对应的实际时间是1970-01-18 13:12:39(远早于当前时间),和当前时间的跨度远超7天,所以方法自然返回了绝对日期格式,完全符合文档里“跨度超7天返回日期”的规则。
解决方案
把currentNewsItem.getTimeInMilliseconds()返回的秒级时间戳乘以1000,转换成毫秒级再传入:
long newsTimeMillis = currentNewsItem.getTimeInMilliseconds() * 1000; CharSequence relativeDate = DateUtils.getRelativeTimeSpanString( System.currentTimeMillis(), newsTimeMillis, DateUtils.MINUTE_IN_MILLIS, // 最小显示到分钟级别,更贴合需求 DateUtils.FORMAT_ABBREV_RELATIVE ); dateView.setText(relativeDate);
额外验证点
如果转换后还是有问题,可以再检查这几点:
- 计算
System.currentTimeMillis()和转换后的newsTimeMillis的差值,确认是否符合预期(比如4小时的话,差值应该是4 * 3600 * 1000 = 14400000左右) - 第三个参数如果传
HOUR_IN_MILLIS,会忽略分钟数直接显示小时;传MINUTE_IN_MILLIS则会在时间差小于1小时时显示分钟,更灵活 - 保留
FORMAT_ABBREV_RELATIVE可以得到更简洁的缩写结果(比如“4h ago”而非“4 hours ago”)
内容的提问来源于stack exchange,提问作者Dave Davis
相关产品推荐
相关产品推荐

