在 Java 開發中,日期時間與字串的相互轉換是高頻剛需。雖然 Java 8 引入了全新的 java.time 套件,但大量既有專案仍使用 java.util.Date、java.sql.Timestamp 與 SimpleDateFormat。本文整理經典轉換範例,涵蓋格式化、解析、多種輸出風格與時間戳處理,並補充現代 API 替代建議。
| 類別 | 套件 | 用途 |
|---|---|---|
Date | java.util | 日期時間基礎類(毫秒精度) |
Timestamp | java.sql | 資料庫時間戳(納秒精度,繼承 Date) |
SimpleDateFormat | java.text | 格式化/解析日期(非執行緒安全) |
DateFormat | java.text | 抽象基類,提供預設風格常數 |
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateIO {
public static void main(String[] args) {
DateIO demo = new DateIO();
// 1. String -> Date
Date date = demo.strToDate("2013-04-01");
// 2. Date -> String (多種風格)
demo.dateToStr(date);
// 3. Timestamp(millis) -> String
demo.timestampToStr(System.currentTimeMillis());
// 4. Date -> Timestamp
demo.strToTimestamp(new Date());
}
// String 轉 Date
public Date strToDate(String strDate) {
// 固定格式:yyyy-MM-dd
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("date: " + date);
return date;
}
// Date 轉 String(展示多種內建風格)
public String dateToStr(Date date) {
DateFormat format;
String str;
// 自訂格式:年-月-日
format = new SimpleDateFormat("yyyy-MM-dd");
str = format.format(date);
System.out.println("自訂 yyyy-MM-dd: " + str);
// SHORT:完全數字,如 2013/4/1
format = DateFormat.getDateInstance(DateFormat.SHORT);
str = format.format(date);
System.out.println("SHORT: " + str);
// MEDIUM:月份縮寫,如 2013年4月1日
format = DateFormat.getDateInstance(DateFormat.MEDIUM);
str = format.format(date);
System.out.println("MEDIUM: " + str);
// FULL:完整風格,如 2013年4月1日 星期一
format = DateFormat.getDateInstance(DateFormat.FULL);
str = format.format(date);
System.out.println("FULL: " + str);
return str;
}
// Timestamp (long 毫秒) -> String
public String timestampToStr(Long timestamp) {
// 格式:yyyy-MM-dd HH:mm:ss(不顯示毫秒)
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = df.format(timestamp);
System.out.println("Timestamp->String: " + str);
return str;
}
// Date -> Timestamp
public Timestamp strToTimestamp(Date date) {
// 先格式化為不含毫秒的字串,再轉 Timestamp
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(date);
Timestamp ts = Timestamp.valueOf(time);
System.out.println("Date->Timestamp: " + ts);
return ts;
}
}
y:年;M:月;d:日H:24小時制;h:12小時制m:分;s:秒;S:毫秒SimpleDateFormat 非執行緒安全請勿將 SimpleDateFormat 實例定義為 static 共用。多執行緒環境下應使用 ThreadLocal 或每次新建實例,或改用 Java 8 DateTimeFormatter(不可變、執行緒安全)。
Timestamp.valueOf(String) 要求格式必須符合 yyyy-MM-dd HH:mm:ss[.fffffffff] 格式,故示例中先用 SimpleDateFormat 格式化後再轉換。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
import java.sql.Timestamp;
// String -> LocalDateTime
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2023-08-15 14:30:00", fmt);
// LocalDateTime -> String
String str = ldt.format(fmt);
// LocalDateTime <-> Timestamp (資料庫交互)
Timestamp ts = Timestamp.valueOf(ldt);
LocalDateTime ldt2 = ts.toLocalDateTime();
// 時區處理
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Instant instant = zdt.toInstant(); // 與 Date.from()/toInstant() 互通
Date 內部存儲 UTC 毫秒數,格式化輸出受預設時區影響,跨時區系統請顯式指定 TimeZoneyyyy 而非 YYYY(週年),避免跨年週邊日期錯誤DateTimeFormatter 或使用 FastDateFormat (Apache Commons Lang)LocalDateTime 或 Instant,避免手動轉 Timestamp掌握 String ⇄ Date ⇄ Timestamp 互轉是 Java 後端開發基本功。維護舊專案時熟練使用 SimpleDateFormat;新專案請毫不猶豫擁抱 java.time,享受不可變、執行緒安全、API 豐富的現代體驗。