Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa pengaturan zona waktu Django mempengaruhi waktu epoch?

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?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql menghitung ke dalam variabel PHP

  2. Bagaimana cara mendapatkan nilai desimal yang tepat tanpa pembulatan di MySQL

  3. dapatkan total batas di mysql menggunakan kueri yang sama?

  4. ketika saya menggunakan alias find_by_sql, saya bingung

  5. Apakah indeks mempercepat lebih dari> perbandingan di MySQL?