DateTimeFormatter.format()
所有 java.time 中的日期时间类(如 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 等)都有一个 format() 方法,该方法需要一个 DateTimeFormatter 对象作为参数。
// 1. 创建一个日期时间对象
LocalDateTime now = LocalDateTime.now();
// 2. 创建一个格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 3. 进行格式化
String formattedDateTime = now.format(formatter);
System.out.println("原始时间: " + now);
System.out.println("格式化后字符串: " + formattedDateTime);
// 输出可能类似于:
// 原始时间: 2025-10-27T15:30:45.123456789
// 格式化后字符串: 2025-10-27 15:30:45
格式化 LocalDateTime (日期和时间)
LocalDateTime 是最常用的类,它不包含时区信息。
常用格式示例
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeFormatExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
// 格式1: yyyy-MM-dd HH:mm:ss (最常用)
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("格式1: " + now.format(formatter1)); // e.g., 2025-10-27 15:30:45
// 格式2: yyyy/MM/dd HH:mm:ss
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println("格式2: " + now.format(formatter2)); // e.g., 2025/10/27 15:30:45
// 格式3: yyyy年MM月dd日 HH时mm分ss秒 (中文格式)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("格式3: " + now.format(formatter3)); // e.g., 2025年10月27日 15时30分45秒
// 格式4: yyyy-MM-dd'T'HH:mm:ss (ISO 8601标准格式)
DateTimeFormatter formatter4 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
System.out.println("格式4: " + now.format(formatter4)); // e.g., 2025-10-27T15:30:45.123456789
}
}
DateTimeFormatter 常用模式字母:
| 字母 | 含义 | 示例 |
|---|---|---|
y |
年 | yyyy (2025), yy (23) |
M |
月 | MM (10), M (10), MMMM (十月) |
d |
日 | dd (27), d (27) |
H |
小时 (24小时制) | HH (15), H (15) |
h |
小时 (12小时制) | hh (03), h (3) |
m |
分钟 | mm (30), m (30) |
s |
秒 | ss (45), s (45) |
S |
纳秒 | SSSSSS (123456) |
a |
上午/下午标记 | AM 或 PM |
E |
星期几 | E (五), EEEE (星期五) |
| 转义文字,用于引号 | 'at' 会显示为 at |
格式化 LocalDate (仅日期)
如果你只需要处理日期部分,使用 LocalDate。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateFormatExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
// 格式1: yyyy-MM-dd
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println("格式1: " + today.format(formatter1)); // e.g., 2025-10-27
// 格式2: yyyy年MM月dd日
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
System.out.println("格式2: " + today.format(formatter2)); // e.g., 2025年10月27日
// 格式3: ISO 8601标准格式
DateTimeFormatter formatter3 = DateTimeFormatter.ISO_LOCAL_DATE;
System.out.println("格式3: " + today.format(formatter3)); // e.g., 2025-10-27
}
}
格式化 LocalTime (仅时间)
如果你只需要处理时间部分,使用 LocalTime。
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class LocalTimeFormatExample {
public static void main(String[] args) {
LocalTime now = LocalTime.now();
// 格式1: HH:mm:ss
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println("格式1: " + now.format(formatter1)); // e.g., 15:30:45
// 格式2: hh:mm:ss a
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("hh:mm:ss a");
System.out.println("格式2: " + now.format(formatter2)); // e.g., 03:30:45 PM
// 格式3: ISO 8601标准格式
DateTimeFormatter formatter3 = DateTimeFormatter.ISO_LOCAL_TIME;
System.out.println("格式3: " + now.format(formatter3)); // e.g., 15:30:45.123456789
}
}
格式化带时区的 ZonedDateTime / OffsetDateTime
当你需要处理不同时区的时间时,应该使用 ZonedDateTime 或 OffsetDateTime,格式化时,时区信息也可以被包含在字符串中。
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class ZonedDateTimeFormatExample {
public static void main(String[] args) {
// 获取当前系统默认时区的时间
ZonedDateTime now = ZonedDateTime.now();
// 格式1: 不带时区信息 (只格式化日期和时间部分)
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("格式1 (无时区): " + now.format(formatter1)); // e.g., 2025-10-27 15:30:45
// 格式2: 带时区信息 (使用 XXX 表示时区偏移量)
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX");
System.out.println("格式2 (带偏移量): " + now.format(formatter2)); // e.g., 2025-10-27 15:30:45 +08:00
// 格式3: 带时区名称 (使用 zzz 表示时区名称)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzz");
System.out.println("格式3 (带时区名): " + now.format(formatter3)); // e.g., 2025-10-27 15:30:45 CST
// 格式4: ISO 8601标准格式 (自动包含时区信息)
DateTimeFormatter formatter4 = DateTimeFormatter.ISO_ZONED_DATE_TIME;
System.out.println("格式4 (ISO): " + now.format(formatter4)); // e.g., 2025-10-27T15:30:45.123456789+08:00[Asia/Shanghai]
}
}
旧版 java.util.Date 的转换 (不推荐,但需了解)
如果你正在维护旧代码,可能会遇到 java.util.Date。Date 本身不包含格式信息,它的 toString() 方法输出的是固定格式,要将其格式化为特定字符串,需要先转换为新的 java.time 对象。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.ZoneId;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class OldDateConversion {
public static void main(String[] args) {
// --- 方法1: 使用旧的 SimpleDateFormat (不推荐线程安全) ---
Date oldDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedOldWay = sdf.format


