Saya bukan guru python atau Django, jadi mungkin seseorang bisa menjawab lebih baik dari saya. Tapi saya tetap akan menebaknya.
Anda mengatakan bahwa Anda menyimpannya dalam DateTimeField
Django , yang menurut dokumen yang Anda rujuk
, menyimpannya sebagai datetime
Python Python .
Melihat dokumen untuk datetime
, menurut saya kuncinya adalah memahami perbedaan antara nilai "naif" dan "sadar".
Dan kemudian meneliti lebih lanjut, saya menemukan referensi luar biasa ini
. Pastikan membaca bagian kedua, "Objek datetime yang naif dan sadar". Itu memberikan sedikit konteks pada seberapa banyak ini dikendalikan oleh Django. Pada dasarnya, dengan mengatur USE_TZ = true
, Anda meminta Django untuk menggunakan sadar datetimes bukannya naif yang.
Jadi kemudian saya melihat kembali pertanyaan Anda. Anda mengatakan bahwa Anda melakukan hal berikut:
dt = datetime.fromtimestamp(secs)
dt = dt.replace(tzinfo=utc)
Melihat fromtimestamp dokumentasi fungsi, saya menemukan sedikit teks ini:
Jadi saya pikir Anda bisa melakukan ini:
dt = datetime.fromtimestamp(secs, tz=utc)
Kemudian lagi, tepat di bawah fungsi itu, dokumen menunjukkan utcfromtimestamp
fungsi, jadi mungkin seharusnya:
dt = datetime.utcfromtimestamp(secs)
Saya tidak cukup tahu tentang python untuk mengetahui apakah ini setara atau tidak, tetapi Anda dapat mencoba dan melihat apakah ada perbedaan.
Semoga salah satu dari ini akan membuat perbedaan. Jika tidak, tolong beritahu saya. Saya sangat akrab dengan tanggal/waktu dalam JavaScript dan .Net, tetapi saya selalu tertarik pada bagaimana nuansa ini dimainkan secara berbeda di platform lain, seperti Python.
Perbarui
Mengenai bagian pertanyaan MySQL, lihat biola ini .
CREATE TABLE foo (`date` DATETIME);
INSERT INTO foo (`date`) VALUES (FROM_UNIXTIME(1371131402));
SET TIME_ZONE="+00:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
SET TIME_ZONE="+01:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
Hasil:
DATE UNIX_TIMESTAMP(`DATE`)
June, 13 2013 13:50:02+0000 1371131402
June, 13 2013 13:50:02+0000 1371127802
Tampaknya perilaku UNIX_TIMESTAMP
fungsi memang dipengaruhi oleh TIME_ZONE
MySQL pengaturan. Itu tidak terlalu mengejutkan, karena ada dalam dokumentasi. Yang mengejutkan adalah bahwa output string dari datetime
memiliki nilai UTC yang sama terlepas dari pengaturannya.
Inilah yang menurut saya sedang terjadi. Dalam dokumen untuk UNIX_TIMESTAMP
fungsi, katanya:
Perhatikan bahwa itu tidak mengatakan bahwa itu bisa menjadi DATETIME
- katanya bisa jadi DATETIME
string . Jadi saya pikir nilai aktual secara implisit dikonversi ke string sebelum diteruskan ke fungsi.
Jadi sekarang lihat biola yang diperbarui ini yang mengonversi secara eksplisit.
SET TIME_ZONE="+00:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
SET TIME_ZONE="+01:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
Hasil:
DATE CONVERT(`DATE`, CHAR) UNIX_TIMESTAMP(CONVERT(`DATE`, CHAR))
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371131402
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371127802
Anda dapat melihat bahwa ketika mengkonversi ke data karakter, itu menghapus offset. Jadi tentu saja, sekarang masuk akal jika UNIX_TIMESTAMP
mengambil nilai ini sebagai input, dengan asumsi pengaturan zona waktu lokal dan dengan demikian mendapatkan stempel waktu UTC yang berbeda.
Tidak yakin apakah ini akan membantu Anda atau tidak. Anda perlu menggali lebih dalam dengan tepat bagaimana Django memanggil MySQL baik untuk membaca maupun menulis. Apakah itu benar-benar menggunakan UNIX_TIMESTAMP
fungsi? Atau hanya itu yang Anda lakukan dalam pengujian?