在Java開發中Date類型轉String類型是比較常見的,其中最常用的是以下幾種方式:
1. 使用SimpleDateFormat(Java 8之前)
import java.text.SimpleDateFormat;
import java.util.Date;public class DateToStringExample {public static void main(String[] args) {Date date = new Date();// 創建日期格式化對象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期為字符串String dateString = sdf.format(date);System.out.println("格式化后的日期: " + dateString);}
}
2. 使用DateTimeFormatter(Java 8及以后)?
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;public class DateToStringJava8 {public static void main(String[] args) {Date date = new Date();// 將Date轉換為LocalDateTimeLocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// 定義格式化模式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化String dateString = localDateTime.format(formatter);System.out.println("格式化后的日期: " + dateString);}
}
擴展:?
常用的日期格式模式
yyyy
:四位年份MM
:兩位月份(01-12)dd
:兩位日期(01-31)HH
:24小時制的小時(00-23)hh
:12小時制的小時(01-12)mm
:分鐘(00-59)ss
:秒(00-59)SSS
:毫秒(000-999)a
:上午/下午標記(AM/PM)
注:需要注意的這兩種方式雖然都可以實現需求,但是兩種方式還是有比較明顯的區別的
1. 所屬 API 體系不同
-
?SimpleDateFormat?:
- 屬于舊的?
java.text
?包 - 配合?
java.util.Date
?和?java.util.Calendar
?使用 - Java 1.1 引入
- 屬于舊的?
-
?DateTimeFormatter?:
- 屬于新的?
java.time.format
?包 - 配合 Java 8 引入的?
java.time
?API (LocalDate
,?LocalDateTime
?等)使用 - Java 8 引入
- 屬于新的?
SimpleDateFormat 和 DateTimeFormatter 的區別
SimpleDateFormat
?和?DateTimeFormatter
?都是 Java 中用于日期時間格式化的類,但它們屬于不同的 API 體系,有顯著的區別:
1. 所屬 API 體系不同
-
?SimpleDateFormat?:
- 屬于舊的?
java.text
?包 - 配合?
java.util.Date
?和?java.util.Calendar
?使用 - Java 1.1 引入
- 屬于舊的?
-
?DateTimeFormatter?:
- 屬于新的?
java.time.format
?包 - 配合 Java 8 引入的?
java.time
?API (LocalDate
,?LocalDateTime
?等)使用 - Java 8 引入
- 屬于新的?
2. 線程安全性(尤其需要注意,面試會問)
-
?SimpleDateFormat?:
- ?不是線程安全的?
- 多線程環境下需要同步或為每個線程創建獨立實例
-
?DateTimeFormatter?:
- ?線程安全?
- 可以安全地在多線程環境中共享實例
3.功能差異
- ?DateTimeFormatter? 提供更多功能:
- 內置預定義的格式化器 (如?
ISO_LOCAL_DATE
) - 更好的本地化支持
- 更靈活的解析和格式化選項
- 支持解析到?
TemporalAccessor
?而不僅僅是特定類型
- 內置預定義的格式化器 (如?
4. 異常處理
-
?SimpleDateFormat?:
- 解析失敗時通常返回錯誤結果而不是拋出異常
- 行為有時不一致
-
?DateTimeFormatter?:
- 解析失敗時拋出?
DateTimeParseException
- 行為更加嚴格和一致
- 解析失敗時拋出?
5. 性能
- ?DateTimeFormatter? 通常性能更好,特別是在多線程環境中
SimpleDateFormat 和 DateTimeFormatter 的區別
SimpleDateFormat
?和?DateTimeFormatter
?都是 Java 中用于日期時間格式化的類,但它們屬于不同的 API 體系,有顯著的區別:
1. 所屬 API 體系不同
-
?SimpleDateFormat?:
- 屬于舊的?
java.text
?包 - 配合?
java.util.Date
?和?java.util.Calendar
?使用 - Java 1.1 引入
- 屬于舊的?
-
?DateTimeFormatter?:
- 屬于新的?
java.time.format
?包 - 配合 Java 8 引入的?
java.time
?API (LocalDate
,?LocalDateTime
?等)使用 - Java 8 引入
- 屬于新的?
2. 線程安全性
-
?SimpleDateFormat?:
- ?不是線程安全的?
- 多線程環境下需要同步或為每個線程創建獨立實例
-
?DateTimeFormatter?:
- ?線程安全?
- 可以安全地在多線程環境中共享實例
3. 功能差異
- ?DateTimeFormatter? 提供更多功能:
- 內置預定義的格式化器 (如?
ISO_LOCAL_DATE
) - 更好的本地化支持
- 更靈活的解析和格式化選項
- 支持解析到?
TemporalAccessor
?而不僅僅是特定類型
- 內置預定義的格式化器 (如?
4. 異常處理
-
?SimpleDateFormat?:
- 解析失敗時通常返回錯誤結果而不是拋出異常
- 行為有時不一致
-
?DateTimeFormatter?:
- 解析失敗時拋出?
DateTimeParseException
- 行為更加嚴格和一致
- 解析失敗時拋出?
5. 性能
- ?DateTimeFormatter? 通常性能更好,特別是在多線程環境中
6. 使用示例對比
// SimpleDateFormat 示例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formatted = sdf.format(new Date());
Date parsed = sdf.parse("2023-11-15");// DateTimeFormatter 示例
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = LocalDate.now().format(dtf);
LocalDate parsed = LocalDate.parse("2023-11-15", dtf);
何時使用哪個?
-
?使用 SimpleDateFormat?:
- 維護舊代碼
- 必須與?
java.util.Date
?交互 - 項目不能使用 Java 8+
-
?使用 DateTimeFormatter?:
- 新開發項目
- 需要線程安全
- 需要更好的API設計和功能
- 可以使用 Java 8+
總結
DateTimeFormatter
?是更現代、更安全、功能更強大的選擇,而?SimpleDateFormat
?主要是為了向后兼容而保留。如果使用 Java 8 或更高版本,強烈建議使用新的?java.time
?API 和?DateTimeFormatter
。