Bagaimana cara membandingkan dua tanggal?

381

Bagaimana saya membandingkan dua tanggal untuk melihat mana yang lebih baru, menggunakan Python?

Misalnya, saya ingin memeriksa apakah tanggal saat ini sudah melewati tanggal terakhir dalam daftar yang saya buat, tanggal liburan, sehingga akan mengirim email secara otomatis, memberitahu admin untuk memperbarui file holiday.txt.

Cecil Rodriguez
sumber
20
Eh, Anda menggunakan <dan >operator, sama seperti dengan perbandingan lainnya.
Daniel Roseman
12
@JohnMachin: Anda menulis fungsi dengan prototipe int compare_dates(void const *, void const*), melemparkan argumen ke struct Date *dan mengimplementasikan logika perbandingan. Mungkin tidak jelas bagi pendatang baru Python.
Fred Foo
1
@ larsmans: Maaf .... s / any_language / any_reasonable_language / dan siapa pun yang terbiasa dengan bahasa yang tidak masuk akal harus menghabiskan beberapa menit membaca dokumen dan mencoba date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects pencarian Ctrl-F untuk "Operasi yang didukung"
John Machin
1
@Galaxy - dia menggunakan analogi, untuk menunjukkan bahwa apa yang seharusnya sederhana untuk orang yang berpengalaman mungkin tidak mudah untuk pemula total dan dia menggunakan C untuk menggambarkan ini. Dia tidak berpikir pertanyaannya adalah tentang C. Dan dia benar, saya adalah seorang pemula pada saat saya menanyakan pertanyaan ini hampir 8 tahun yang lalu, dan tidak tahu bagaimana cara kerjanya.
Cecil Rodriguez

Jawaban:

496

Gunakan datetimemetode dan operator <dan kerabatnya.

>>> from datetime import datetime, timedelta
>>> past = datetime.now() - timedelta(days=1)
>>> present = datetime.now()
>>> past < present
True
>>> datetime(3000, 1, 1) < present
False
>>> present - datetime(2000, 4, 4)
datetime.timedelta(4242, 75703, 762105)
Fred Foo
sumber
19
Ini berfungsi untuk nilai sadar zona waktu juga, jika ada yang bertanya-tanya.
Mat Gessel
2
Apa bedanya antara pastdan present? Saya tidak dapat memahami contoh Anda dan hasilnya tidak masuk akal.
Emadpres
19
@Emadpres: bayangkan ini diketik secara manual. Baris yang lalu diketik terlebih dahulu, sedangkan baris yang sekarang diketik yang kedua ... jadi baris yang lalu dimasukkan terlebih dahulu, jadi yang lalu <present is True.
ramcdougal
2
Mengutip dari dokumen: "Jika satu pembanding adalah naif dan yang lainnya sadar, TypeError dinaikkan jika perbandingan pesanan dilakukan. Untuk perbandingan kesetaraan, contoh naif tidak pernah sama dengan contoh yang diwaspadai. Jika kedua pembanding sadar, dan memiliki yang sama Atribut tzinfo, atribut tzinfo umum diabaikan dan basis data dibandingkan. Jika kedua pembanding mengetahui dan memiliki atribut tzinfo yang berbeda, perbandingan pertama kali disesuaikan dengan mengurangi offset UTC mereka (diperoleh dari self.utcoffset ()). "
Vikas Prasad
2
Nama variabel harus pastdan past_but_a_little_after. Secara teknis, presentjuga di masa lalu ketika perbandingan past < presentdibuat.
grisaitis
75

Menggunakan time

Katakanlah Anda memiliki tanggal awal sebagai string seperti ini:
date1 = "31/12/2015"
date2 = "01/01/2016"

Anda dapat melakukan hal berikut:
newdate1 = time.strptime(date1, "%d/%m/%Y")dan newdate2 = time.strptime(date2, "%d/%m/%Y")mengubahnya menjadi format tanggal python. Kemudian, perbandingannya jelas:

newdate1 > newdate2akan kembali False
newdate1 < newdate2akan kembaliTrue

Guillermo Pereira
sumber
40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)akan kembali True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)akan kembali datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)akan kembali datetime.timedelta(1).

lihat dokumen .

Daniel Nill
sumber
3

Jawaban lain menggunakan datetimedan perbandingan juga berfungsi hanya untuk waktu, tanpa tanggal.

Misalnya, untuk memeriksa apakah saat ini kurang lebih dari jam 8:00 pagi, kita dapat menggunakan:

import datetime

eight_am = datetime.time( 8,0,0 ) # Time, without a date

Dan kemudian dibandingkan dengan:

datetime.datetime.now().time() > eight_am  

yang akan kembali True

Luis
sumber
-1

Untuk menghitung hari dalam dua perbedaan tanggal, dapat dilakukan seperti di bawah ini:

import datetime
import math

issuedate = datetime(2019,5,9)   #calculate the issue datetime
current_date = datetime.datetime.now() #calculate the current datetime
diff_date = current_date - issuedate #//calculate the date difference with time also
amount = fine  #you want change

if diff_date.total_seconds() > 0.0:   #its matching your condition
    days = math.ceil(diff_date.total_seconds()/86400)  #calculate days (in 
    one day 86400 seconds)
    deductable_amount = round(amount,2)*days #calclulated fine for all days

Karena jika satu detik lebih dari tanggal jatuh tempo maka kita harus menagih

Pallavi Sharma
sumber
Tidak menjawab pertanyaan.
Willwsharp