| Java 類型 | 包 | 對應 MySQL | 特點 |
|---|---|---|---|
| java.sql.Date | java.sql | DATE | 僅保存日期(年月日),時分秒歸零,JDBC 標準映射 |
| java.sql.Timestamp | java.sql | DATETIME / TIMESTAMP | 保存納秒精度日期時間,JDBC 標準映射,**推薦用於 datetime** |
| java.util.Date | java.util | DATETIME / TIMESTAMP | 繼承關係:Timestamp extends Date,攜帶毫秒精度,通用但非 JDBC 標準 |
| LocalDateTime | java.time (Java 8+) | DATETIME / TIMESTAMP | 不可變、線程安全、無時區、**現代首選**,需 JPA 2.2+/MyBatis 3.4+ 支持 |
LocalDateTime (Java 8+) 或 java.sql.Timestamp,完整保存時分秒。java.sql.Date 映射 datetime,會丟失時間部分。import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class CheckIn {
private LocalDateTime inTime; // 實體類推薦
public CheckIn(LocalDateTime inTime) {
this.inTime = inTime;
}
// 獲取格式化字符串:2024-01-15 14:30:45
public String getFormatTime(String pattern) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern);
return inTime.format(fmt);
}
// 舊版 Date 互轉
public Date toUtilDate() {
return Date.from(inTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static CheckIn fromUtilDate(Date date) {
return new CheckIn(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
}
// JDBC 存取輔助
public Timestamp toSqlTimestamp() {
return Timestamp.valueOf(inTime); // LocalDateTime -> Timestamp
}
public static CheckIn fromSqlTimestamp(Timestamp ts) {
return new CheckIn(ts.toLocalDateTime()); // Timestamp -> LocalDateTime
}
public static void main(String[] args) {
CheckIn ci = new CheckIn(LocalDateTime.now());
System.out.println(ci.getFormatTime("yyyy-MM-dd HH:mm:ss"));
// 輸出: 2024-01-15 14:30:45
}
}
@Column(name = "in_time")
private LocalDateTime inTime; // Hibernate 5.2+ 自動支持
DateTimeFormatter (不可變、線程安全) 或 ThreadLocal 包裝。new Date() 獲取的是 JVM 默認時區時間,存入 MySQL TIMESTAMP 會自動轉換為 UTC 存儲,讀出再轉回會話時區。統一在連接串指定 serverTimezone=UTC,應用層顯式處理時區轉換。'0000-00-00 00:00:00',Java 無法映射,建議表定義 DEFAULT CURRENT_TIMESTAMP 或應用層非空校驗。掌握 LocalDateTime ⇄ Timestamp ⇄ MySQL DATETIME 鏈路,時間處理不再踩坑。