Bạn đang giải thích điều này một cách sai lầm. Cơ sở dữ liệu lưu trữ thời gian UTC hầu hết thời gian. Nếu bạn sử dụng PostgreSQL, cơ sở dữ liệu có thể lưu trữ thời gian với thông tin múi giờ, nhưng đối với các mục đích thực tế (*), dễ nhất là bạn chỉ nghĩ rằng thời gian trong db của bạn được lưu trữ dưới dạng UTC (tức là thời gian tuyệt đối có thể được chuyển đổi thành bất kỳ lúc nào vùng) khi USE_TZ = True
. Nó luôn đại diện cho một thời điểm chính xác mà bạn không cần nhớ hoặc giả sử bất kỳ múi giờ nào. Và theo như tôi biết, Django sẽ luôn lưu trữ thời gian dưới dạng nhận biết thời gian trong múi giờ UTC.
Vì vậy, khi bạn đang tìm nạp đối tượng thời gian bằng cách sử dụng select
trong psql , bạn đang lấy lại thời gian theo múi giờ địa phương của máy (múi giờ mà bạn đang chạy psql). Nếu ai đó ở "America / New_York" chạy cùng một truy vấn đã chọn, họ sẽ thấy dấu thời gian -04. Nếu ngày là 2019-03-20, thì bạn đã thấy 2019-03-20 10:50:00+00
bởi vì vào ngày đó, Châu Âu / Luân Đôn và UTC giống nhau.
Khi tìm nạp giá trị của DateTimeField
dưới dạng python datetime.datetime
đối tượng, Django luôn tìm nạp giá trị UTC, bởi vì:
Điều này giúp làm việc với các đối tượng datetime này trong mã python của bạn dễ dàng hơn:Chúng luôn là giờ UTC.
Nếu bạn muốn in các giá trị này trong một tệp PDF, hãy sử dụng các phương pháp tương tự mà Django sử dụng để hiển thị mẫu:
from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))
Điều này hiển thị ngày giờ trong múi giờ mặc định (hoặc nếu bạn activate()
múi giờ khác, ở múi giờ hiện tại ).
(*) Lưu ý:Tại sao bạn không nên cho biết bất kỳ ý nghĩa nào đối với múi giờ được lưu trong db của bạn và chỉ nghĩ về nó như thể đó là UTC:Nếu bạn chạy máy chủ ở nhiều múi giờ khác nhau, bạn có thể thực sự lưu dấu thời gian ở các múi giờ khác nhau . Tất cả chúng vẫn chính xác (dấu thời gian tuyệt đối) và có thể được chuyển đổi sang bất kỳ múi giờ nào khác. Vì vậy, về cơ bản múi giờ được sử dụng để tiết kiệm là vô nghĩa.