在Java中,日期格式化主要涉及将 Date、LocalDate、LocalDateTime 等日期时间对象转换为指定格式的字符串,或将字符串解析为日期对象。以下是两种常用的日期格式化方式:
一、使用 SimpleDateFormat(旧版API,Java 8之前)
 
SimpleDateFormat 是Java早期版本中用于格式化和解析日期的类,但它是非线程安全的,需谨慎使用。
1. 格式化为字符串
java
复制
下载
import java.text.SimpleDateFormat;
import java.util.Date;public class Main {public static void main(String[] args) {Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String formattedDate = sdf.format(date);System.out.println(formattedDate); // 例如:2023-10-05 15:30:45}
} 
2. 字符串解析为日期
java
复制
下载
String dateStr = "2023-10-05";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateStr); // 需处理 ParseException 
常用模式符号:
-  
yyyy:四位年份(如2023) -  
MM:两位月份(01-12) -  
dd:两位日期(01-31) -  
HH:24小时制小时(00-23) -  
hh:12小时制小时(01-12) -  
mm:分钟(00-59) -  
ss:秒(00-59) -  
SSS:毫秒(000-999) -  
E:星期几(如Mon、Tue) 
二、使用 DateTimeFormatter(新版API,Java 8+)
 
Java 8引入了 java.time 包,提供了线程安全的 LocalDate、LocalDateTime 和 DateTimeFormatter。
1. 格式化为字符串
java
复制
下载
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class Main {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formattedDate = now.format(formatter);System.out.println(formattedDate); // 例如:2023-10-05 15:30:45}
} 
2. 字符串解析为日期
java
复制
下载
String dateStr = "2023-10-05 15:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter); // 需处理 DateTimeParseException 
3. 预定义的格式
java
复制
下载
// 使用内置标准格式(如ISO日期时间格式) String isoFormat = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); // 输出:2023-10-05T15:30:45.123
常用模式符号(与旧版类似,但更严格):
-  
uuuu:四位年份(替代yyyy,推荐使用) -  
MM/dd/HH/mm/ss:同上 -  
a:上午/下午标记(如AM/PM) 
三、时区处理
若需处理时区,可使用 ZonedDateTime:
java
复制
下载
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;ZonedDateTime zonedDateTime = ZonedDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
String formatted = zonedDateTime.format(formatter); // 例如:2023-10-05 15:30:45 CST 
四、注意事项
-  
线程安全:
-  
SimpleDateFormat非线程安全,多线程环境下需同步或使用ThreadLocal。 -  
DateTimeFormatter是线程安全的,可全局共享。 
 -  
 -  
错误处理:
-  
解析字符串时需捕获
ParseException(旧版)或DateTimeParseException(新版)。 
 -  
 -  
性能:
-  
新版API(
java.time)性能更优,推荐使用。 
 -  
 
完整示例(Java 8+)
java
复制
下载
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class DateTimeExample {public static void main(String[] args) {// 格式化LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm");String formatted = now.format(formatter);System.out.println("当前时间:" + formatted); // 例如:2023年10月05日 15:30// 解析String dateStr = "2023年12月31日 23:59";LocalDateTime parsedDate = LocalDateTime.parse(dateStr, formatter);System.out.println("解析后的时间:" + parsedDate);}
} 
建议优先使用 java.time 包(Java 8+),其设计更现代且线程安全。旧版 SimpleDateFormat 仅适用于兼容遗留代码。