Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để lưu trữ java.util.Date vào trường dấu thời gian MySQL trong múi giờ UTC / GMT?

Câu trả lời ngắn gọn là:

  • thêm "default-time-zone =utc" vào my.cnf
  • trong mã của bạn, hãy luôn "nghĩ" theo UTC, ngoại trừ khi hiển thị ngày tháng cho người dùng của bạn
  • khi lấy / đặt ngày hoặc dấu thời gian bằng JDBC, hãy luôn sử dụng tham số Lịch, được đặt thành UTC:

    resultset.getTimestamp ("my_date", Calendar.getInstance (TimeZone.getTimeZone ("UTC")));

  • đồng bộ hóa máy chủ của bạn với NTP hoặc chỉ dựa vào máy chủ cơ sở dữ liệu để cho bạn biết mấy giờ.

Câu trả lời dài là sau:

Khi xử lý ngày và múi giờ trong bất kỳ cơ sở dữ liệu nào và với bất kỳ mã khách hàng nào, tôi thường đề xuất chính sách sau:

  1. Định cấu hình cơ sở dữ liệu của bạn để sử dụng múi giờ UTC , thay vì sử dụng múi giờ cục bộ của máy chủ (tất nhiên trừ khi đó là UTC).

    • Làm thế nào để làm như vậy phụ thuộc vào máy chủ cơ sở dữ liệu của bạn. Hướng dẫn về MySQL có thể được tìm thấy tại đây: http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Về cơ bản, bạn cần viết điều này trong my.cnf:default-time-zone =utc

    • Bằng cách này, bạn có thể lưu trữ các máy chủ cơ sở dữ liệu của mình ở bất kỳ đâu, thay đổi vị trí lưu trữ dễ dàng và nói chung là thao tác ngày tháng trên máy chủ của bạn mà không có bất kỳ sự mơ hồ nào.

    • Nếu bạn thực sự thích sử dụng múi giờ địa phương, tôi khuyên bạn nên ít nhất tắt Giờ tiết kiệm ánh sáng ban ngày, vì việc có ngày tháng không rõ ràng trong cơ sở dữ liệu của bạn có thể là một cơn ác mộng thực sự.
      • Ví dụ:nếu bạn đang xây dựng một dịch vụ điện thoại và bạn đang sử dụng Giờ tiết kiệm ánh sáng ban ngày trên máy chủ cơ sở dữ liệu của mình thì bạn đang gặp rắc rối:sẽ không có cách nào để biết liệu khách hàng đã gọi từ "2008- 10-26 02:30:00 "đến" 2008-10-26 02:35:00 "thực sự được gọi trong 5 phút hoặc trong 1 giờ 5 phút (giả sử Daylight Saving diễn ra vào 3 giờ sáng ngày 26 tháng 10)!
  2. Bên trong mã ứng dụng của bạn, luôn sử dụng ngày UTC, ngoại trừ khi hiển thị ngày cho người dùng của bạn.

    • Trong Java, khi đọc từ cơ sở dữ liệu, hãy luôn sử dụng:

    Dấu thời gian myDate =resultSet.getTimestamp ("my_date", Calendar.getInstance (TimeZone.getTimeZone ("UTC")));

    • Nếu bạn không làm điều này, dấu thời gian sẽ được coi là ở TimeZone địa phương của bạn, thay vì UTC.
  3. Đồng bộ hóa máy chủ của bạn hoặc chỉ dựa vào thời gian của máy chủ cơ sở dữ liệu

    • Nếu bạn có máy chủ Web của mình trên một máy chủ (hoặc nhiều hơn) và máy chủ cơ sở dữ liệu của bạn trên một số máy chủ khác, thì tôi thực sự khuyên bạn nên đồng bộ hóa đồng hồ của chúng với NTP.

    • HOẶC, chỉ dựa vào một máy chủ để cho bạn biết mấy giờ. Thông thường, máy chủ cơ sở dữ liệu là máy chủ tốt nhất để yêu cầu thời gian. Nói cách khác, tránh mã như sau:

    readyStatement =connect.prepareStatement ("CẬP NHẬT my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date (); // giờ địa phương! :-(
    readyStatement.setTimestamp (1, Dấu thời gian mới (now.getTime ()));
    int result =readyStatement.execute ();

    • Thay vào đó, hãy dựa vào thời gian của máy chủ cơ sở dữ liệu:

    readyStatement =connection.prepareStatement ("CẬP NHẬT my_table SET my_time =NOW () WHERE [...]");
    int result =readyStatement.execute ();

Hi vọng điêu nay co ich! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cố gắng cập nhật 640k hàng trong mySQL bị Mất kết nối với máy chủ MySQL trong khi truy vấn

  2. MySQL CHÈN VÀO ... GIÁ TRỊ và CHỌN

  3. Làm cách nào để lưu trữ ngày UTC ISO8601 trong cơ sở dữ liệu MySQL?

  4. Làm thế nào để ngăn chặn đầu ra và kiểm tra xem một lệnh có thành công hay không?

  5. Mã thông báo Firebase FCM - Khi nào thì gửi đến máy chủ?