首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Date 與 MySQL datetime 互轉完整指南:java.sql.Date、java.util.Date、SimpleDateFormat 選型與代碼最佳實踐

     編輯:程式設計綜合問答

類型對應關係

Java 類型包對應 MySQL特點
java.sql.Datejava.sqlDATE僅保存日期(年月日),時分秒歸零,JDBC 標準映射
java.sql.Timestampjava.sqlDATETIME / TIMESTAMP保存納秒精度日期時間,JDBC 標準映射,**推薦用於 datetime**
java.util.Datejava.utilDATETIME / TIMESTAMP繼承關係:Timestamp extends Date,攜帶毫秒精度,通用但非 JDBC 標準
LocalDateTimejava.time (Java 8+)DATETIME / TIMESTAMP不可變、線程安全、無時區、**現代首選**,需 JPA 2.2+/MyBatis 3.4+ 支持

核心建議

  • 實體類字段用 LocalDateTime (Java 8+) 或 java.sql.Timestamp,完整保存時分秒。
  • 不要用 java.sql.Date 映射 datetime,會丟失時間部分。
  • 數據庫存儲用 UTC,應用層按用戶時區展示。

完整代碼示例

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
    }
}

MyBatis / JPA 映射配置





@Column(name = "in_time")
private LocalDateTime inTime; // Hibernate 5.2+ 自動支持

避坑清單

  • SimpleDateFormat 非線程安全:勿作 static 字段,改用 DateTimeFormatter (不可變、線程安全) 或 ThreadLocal 包裝。
  • 時區陷阱:new Date() 獲取的是 JVM 默認時區時間,存入 MySQL TIMESTAMP 會自動轉換為 UTC 存儲,讀出再轉回會話時區。統一在連接串指定 serverTimezone=UTC,應用層顯式處理時區轉換。
  • 零值日期:MySQL 允许 '0000-00-00 00:00:00',Java 無法映射,建議表定義 DEFAULT CURRENT_TIMESTAMP 或應用層非空校驗。

掌握 LocalDateTime ⇄ Timestamp ⇄ MySQL DATETIME 鏈路,時間處理不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved