在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
仅适用于兼容遗留代码。