%tF 是 Java 中 String.format() 的内置日期格式化占位符,专用于输出 yyyy-MM-dd 格式,支持 long、Date、Calendar、LocalDate、LocalDateTime 等类型,但不支持字符串输入或自定义分隔符。

%tF 是 Java 中 String.format() 提供的内置日期格式化占位符,专用于输出 yyyy-MM-dd 格式的日期字符串,无需引入任何第三方库(如 Joda-Time 或 java.time.format.DateTimeFormatter),适合快速、轻量级的日期输出场景。
什么是 %tF?
它是 java.util.Formatter 定义的「时间/日期转换」之一,属于「复合转换」:以 %t 开头,后跟单个格式字母。其中 F 表示 ISO 8601 date format,即 yyyy-MM-dd。
它只接受 日期类参数:包括 long(毫秒时间戳)、java.util.Date、java.util.Calendar、java.time.temporal.TemporalAccessor(如 LocalDateTime、LocalDate 等 Java 8+ 类型)。
基本用法示例
直接传入支持的时间对象即可:
-
String.format("%tF", System.currentTimeMillis())→"2024-06-15" -
String.format("%tF", new Date())→"2024-06-15" -
String.format("%tF", LocalDate.now())→"2024-06-15" -
String.format("%tF", LocalDateTime.now())→"2024-06-15"(只取日期部分)
注意事项与常见陷阱
不支持自定义分隔符或局部格式:%tF 固定输出 yyyy-MM-dd,不能改成 yyyy/MM/dd 或 dd.MM.yyyy。如需其他格式,应改用 %tY-%tm-%td 手动拼接,或使用 java.time.format.DateTimeFormatter。
时区敏感性取决于输入类型:
- 传
long或Date:按 JVM 默认时区解释为本地日期 - 传
LocalDate:无时区,直接输出 - 传
ZonedDateTime或含时区的Instant:会先转换为系统默认时区再取日期部分
不能单独对字符串解析后格式化:%tF 不接受 "2024-01-01" 这类字符串,必须是可识别的时间类型。若只有字符串,需先解析(如用 LocalDate.parse()),再传入。
替代方案(当 %tF 不够用时)
若需要更多控制,又不想引入第三方库,可组合其他 %t 占位符:
-
String.format("%tY年%tm月%td日", LocalDate.now())→"2024年06月15日" -
String.format("%td/%tm/%tY", Calendar.getInstance())→"15/06/2024" -
String.format("%tF %tR", new Date())→"2024-06-15 14:30"(日期 + 24小时制时间)
注意:所有 %tX 必须共用同一个时间参数,不能写成 String.format("%tF", d1, "%tR", d2) —— 多参数需按顺序对应,且每个 %t 都消耗一个参数。

















