Saya mencoba membandingkan tanggal dan waktu saat ini dengan tanggal dan waktu yang ditentukan dalam model menggunakan operator perbandingan:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
Kesalahan skrip dengan:
TypeError: can't compare offset-naive and offset-aware datetimes
Modelnya terlihat seperti ini:
class Fundraising_Challenge(models.Model):
name = models.CharField(max_length=100)
datetime_start = models.DateTimeField()
datetime_end = models.DateTimeField()
Saya juga punya Django menggunakan tanggal dan waktu lokal.
Yang belum bisa saya temukan adalah format yang digunakan Django untuk DateTimeField (). Apakah naif atau sadar? Dan bagaimana cara mendapatkan datetime.now () untuk mengenali datetime lokal?
python
django
datetime
comparison
sccrthlt
sumber
sumber
Jawaban:
Secara default,
datetime
objek beradanaive
dalam Python, jadi Anda harus membuat keduanya objek yang naif atau sadardatetime
. Ini dapat dilakukan dengan menggunakan:Catatan: Ini akan menaikkan
ValueError
jikatzinfo
sudah diatur. Jika Anda tidak yakin tentang itu, gunakan sajaBTW, Anda bisa memformat stempel waktu UNIX di objek datetime.datetime dengan info zona waktu sebagai berikut
sumber
tzinfo
tidak melakukan konversi, membuat perbandingan salah.utc = pytz.utc
untuk mencegah kesalahan pylintNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. tautan pytzdatetime.datetime.now
tidak sadar zona waktu.Django datang dengan pembantu untuk ini, yang membutuhkan
pytz
Anda harus dapat membandingkan
now
kechallenge.datetime_start
sumber
USE_TZ=True
kemudiantimezone.now()
mengembalikan objek waktu-sadar zona waktu bahkan jikapytz
tidak diinstal (meskipun mungkin disarankan untuk menginstal karena alasan lain).Satu baris solusi kode
Versi yang dijelaskan
Ringkasan
Anda harus menambahkan info zona waktu ke
now()
datetime Anda .Namun, Anda harus menambahkan zona waktu yang sama dari variabel referensi; itu sebabnya saya pertama kali membaca
tzinfo
atribut.sumber
Nonaktifkan zona waktu. Menggunakan
challenge.datetime_start.replace(tzinfo=None);
Anda juga dapat menggunakan
replace(tzinfo=None)
untuk datetime lainnya .sumber
Jadi cara saya akan memecahkan masalah ini adalah untuk memastikan dua datetimes berada di zona waktu yang tepat.
Saya dapat melihat bahwa Anda menggunakan
datetime.now()
yang akan mengembalikan waktu sistem saat ini, tanpa set tzinfo.tzinfo adalah informasi yang dilampirkan pada datetime untuk memberi tahu zona waktu itu. Jika Anda menggunakan datetime naif, Anda harus konsisten melalui sistem Anda. Saya sangat merekomendasikan hanya menggunakan
datetime.utcnow()
melihat di suatu tempat Anda sedang membuat datetime yang memiliki tzinfo terkait dengan mereka, apa yang perlu Anda lakukan adalah memastikan mereka dilokalkan (memiliki tzinfo terkait) ke zona waktu yang benar.
Lihatlah Delorean , itu membuat berurusan dengan hal semacam ini jauh lebih mudah.
sumber
Ini bekerja dari saya. Di sini saya membuat geeting tabel yang dibuat datetime dan menambahkan 10 menit pada datetime. nanti tergantung pada waktu saat ini, Operasi Kedaluwarsa selesai.
Menambahkan 10 menit pada waktu database
table_datetime = '2019-06-13 07: 49: 02.832969' (contoh)
Ini berhasil untuk saya.
sumber
Hanya:
Jadi lakukan ini:
lalu gunakan
start_time
danend_time
sumber