useTimezone là một giải pháp cũ hơn. Nhóm MySQL đã viết lại mã setTimestamp / getTimestamp khá gần đây, nhưng nó sẽ chỉ được bật nếu bạn đặt tham số kết nối useLegacyDatetimeCode =false và bạn đang sử dụng phiên bản mới nhất của trình kết nối JDBC mysql. Ví dụ:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Nếu bạn tải xuống mã nguồn mysql-connector và nhìn vào setTimestamp, bạn sẽ rất dễ dàng biết được điều gì đang xảy ra:
Nếu sử dụng mã ngày giờ kế thừa =false, newSetTimestampInternal (...) được gọi. Sau đó, nếu Lịch được chuyển đến newSetTimestampInternal là NULL, đối tượng ngày tháng của bạn được định dạng theo múi giờ của cơ sở dữ liệu:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Điều rất quan trọng là Lịch trống - vì vậy hãy đảm bảo rằng bạn đang sử dụng:
setTimestamp(int,Timestamp).
... NOT setTimestamp (int, Timestamp, Calendar).
Rõ ràng là bây giờ nó hoạt động như thế nào. Nếu bạn xây dựng một ngày:5 tháng 1 năm 2011 3:00 sáng ở Mỹ / Los_Angeles (hoặc bất kỳ múi giờ nào bạn muốn) bằng cách sử dụng java.util.Calendar và gọi setTimestamp (1, myDate), thì đó sẽ là ngày của bạn, hãy sử dụng SimpleDateFormat để định dạng nó trong múi giờ cơ sở dữ liệu . Vì vậy, nếu DB của bạn ở America / New_York, nó sẽ xây dựng Chuỗi '2011-01-05 6:00:00' để được chèn (vì NY đi trước LA 3 giờ).
Để truy xuất ngày, hãy sử dụng getTimestamp (int) (không có Lịch). Một lần nữa, nó sẽ sử dụng múi giờ cơ sở dữ liệu để xây dựng ngày.
Lưu ý: Múi giờ của máy chủ web hoàn toàn không liên quan! Nếu bạn không đặt useLegacyDatetimecode thành false, múi giờ của máy chủ web sẽ được sử dụng để định dạng - thêm nhiều nhầm lẫn.
Lưu ý:
Có thể MySQL của tôi phàn nàn rằng múi giờ máy chủ không rõ ràng. Ví dụ:nếu cơ sở dữ liệu của bạn được đặt để sử dụng EST, có thể có một số múi giờ EST có thể có trong Java, vì vậy bạn có thể làm rõ điều này cho trình kết nối mysql bằng cách cho nó biết chính xác múi giờ của cơ sở dữ liệu là gì:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Bạn chỉ cần làm điều này nếu nó phàn nàn.