Anda salah menafsirkan ini. Basis data menyimpan waktu UTC sebagian besar waktu. Jika Anda menggunakan PostgreSQL, database dapat menyimpan waktu dengan info zona waktu, tetapi untuk tujuan praktis (*) paling mudah untuk berpikir bahwa waktu di db Anda disimpan sebagai UTC (yaitu sebagai waktu absolut yang dapat dikonversi ke waktu kapan saja zone) ketika USE_TZ = True
. Itu selalu mewakili titik waktu yang tepat di mana Anda tidak perlu mengingat atau mengasumsikan zona waktu apa pun. Dan sejauh yang saya tahu, Django akan selalu menyimpan waktu sebagai time-aware di zona waktu UTC.
Jadi ketika Anda mengambil objek waktu menggunakan select
di psql , Anda mendapatkan kembali waktu di zona waktu lokal mesin Anda (zona waktu tempat Anda menjalankan psql). Jika seseorang di "America/New_York" menjalankan kueri pemilihan yang sama, dia akan melihat stempel waktu -04. Seandainya tanggal 20-03-2019, Anda akan melihat 2019-03-20 10:50:00+00
karena pada tanggal tersebut, Eropa/London dan UTC adalah sama.
Saat mengambil nilai DateTimeField
sebagai datetime.datetime
python objek, Django selalu mengambil nilai UTC, karena:
Ini membuatnya lebih mudah untuk bekerja dengan objek datetime ini dalam kode python Anda:Mereka selalu waktu UTC.
Jika Anda ingin mencetak nilai-nilai ini dalam PDF, gunakan metode yang sama yang digunakan Django untuk perenderan templat:
from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))
Ini membuat datetime di zona waktu default (atau jika Anda activate()
zona waktu yang berbeda, di zona waktu saat ini ).
(*) Catatan:Mengapa Anda tidak boleh memberi arti apa pun pada zona waktu yang disimpan di db Anda dan pikirkan saja seolah-olah itu semua UTC:Jika Anda menjalankan server di berbagai zona waktu, Anda mungkin akhirnya menyimpan cap waktu di zona waktu yang berbeda . Semuanya masih benar (cap waktu absolut) dan dapat dikonversi ke zona waktu lainnya. Jadi pada dasarnya zona waktu yang digunakan untuk menyimpan tidak ada artinya.