Android DateFormat格式化时间毫秒位仅显示SSS问题
问题说明
获取带毫秒值的当前时间时,格式化输出后毫秒位未正常解析,仅显示SSS字符,实际输出样例:20:41:03.SSS some other text
直接通过Toast展示格式化后的日期,输出结果完全一致。
相关实现代码:
import android.text.format.DateFormat import java.util.Calendar ... String.format( "%s IOException: %s", DateFormat.format("HH:mm:ss.SSS", Calendar.getInstance().time), ex.message )
问题原因
android.text.format.DateFormat是Android提供的本地化时间格式化类,它的格式占位符规则和Java标准的时间格式化类不兼容,不支持SSS毫秒占位符,遇到未实现的占位符时会直接原样输出字符,不会做解析替换。
修复方案
不要用Android自带的DateFormat做自定义毫秒精度的时间格式化,替换为Java标准的SimpleDateFormat即可:
import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale ... // 建议指定Locale避免部分地区系统默认配置导致的格式异常 val timeFormat = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault()) String.format( "%s IOException: %s", timeFormat.format(Calendar.getInstance().time), ex.message )
如果项目minSdkVersion >= 24,也可以直接用Java 8新增的java.time系列API实现,线程安全更可靠:
import java.time.LocalTime import java.time.format.DateTimeFormatter ... val timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS") String.format( "%s IOException: %s", LocalTime.now().format(timeFormatter), ex.message )
注意:
android.text.format.DateFormat的设计目标是适配用户系统设置的时间、日期展示格式,不适合用来做自定义精确格式(尤其是带毫秒的日志、时间戳场景)的格式化。
内容的提问来源于stack exchange,提问作者snich
相关产品推荐
相关产品推荐

