İki tarih nasıl karşılaştırılır?


381

Python kullanarak hangisinin daha sonra olduğunu görmek için iki tarihi nasıl karşılaştırırım?

Örneğin, geçerli tarihin oluşturduğum bu listedeki son tarihi geçip geçmediğini kontrol etmek istiyorum, böylece otomatik olarak bir e-posta gönderecek ve yöneticiye holiday.txt dosyasını güncellemesini söyleyecek.


20
E, <ve diğer >operatörlerde olduğu gibi operatörleri kullanırsınız .
Daniel Roseman

12
@JohnMachin: prototip ile bir işlev yazar int compare_dates(void const *, void const*), her iki argümanı da yayınlar struct Date *ve karşılaştırma mantığını uygularsınız. Bir Python yeni gelen için bu kadar açık olmayabilir.
Fred Foo

1
@larsmans: Üzgünüm .... s / any_language / any_reasonable_language / ve mantıksız bir dile alışmış herkes dokümanları inceleyerek ve tarihi denemek için birkaç dakika harcamalıdır1 <tarih2
John Machin

2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F "Desteklenen işlemler" için arama
John Machin

1
@Galaxy - tecrübeli bir kişi için basit olması gerekenin toplam yeni başlayanlar için basit olmayabileceğini göstermek için bir benzetme kullanıyor ve bunu göstermek için C'yi kullanıyor. Sorunun C ile ilgili olduğunu düşünmüyor ve haklıydı, neredeyse 8 yıl önce bu soruyu sorduğumda tamamen yeni başladım ve herhangi birinin nasıl çalıştığına dair hiçbir fikri yoktu.
Cecil Rodriguez

Yanıtlar:


495

Kullanım datetimeyöntemi ve operatör <ve kin.

>>> 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)

19
Bu, eğer merak eden biri varsa, saat dilimine duyarlı değerler için de geçerlidir.
Mat Gessel

2
Arasında farklı nedir pastve present? Örneğini anlayamıyorum ve sonucu mantıklı değil.
Emadpres

19
@Emadpres: Bunun elle yazıldığını düşünün. İlk önce geçmiş satır yazılırken, mevcut satır ikinci yazılır ... bu nedenle ilk satır önce girilir, bu nedenle geçmiş <present True olur.
ramcdougal

2
Dokümandan alıntı: "Bir karşılaştırıcı saf ve diğeri farkındaysa, bir sipariş karşılaştırması denenirse TypeError yükseltilir. Eşitlik karşılaştırmaları için, saf örnekler hiçbir zaman farkında örneklere eşit olmaz. Her iki karşılaştırıcı da farkındaysa ve aynıysa tzinfo özniteliği, ortak tzinfo özniteliği yoksayılır ve temel tarihler karşılaştırılır. Her iki karşılaştırıcı da farkındaysa ve farklı tzinfo özniteliklerine sahipse, karşılaştırıcılar önce UTC ofsetlerini (self.utcoffset () 'den elde edilir) çıkarılarak ayarlanır. "
Vikas Prasad

2
Değişken isimleri pastve olmalıdır past_but_a_little_after. Teknik olarak, presentkarşılaştırma past < presentyapıldığında da geçmişte kaldı .
grisaitis

75

kullanım time

Diyelim ki ilk tarihler aşağıdaki gibi dizgiler var:
date1 = "31/12/2015"
date2 = "01/01/2016"

Aşağıdakileri yapabilirsiniz:
newdate1 = time.strptime(date1, "%d/%m/%Y")ve newdate2 = time.strptime(date2, "%d/%m/%Y")bunları python'un tarih biçimine dönüştürmek için. Sonra karşılaştırma açıktır:

newdate1 > newdate2geri False
newdate1 < newdate2dönecekTrue


40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2) geri dönücek True .

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2) geri dönücek datetime.timedelta(-1) .

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2) geri dönücek datetime.timedelta(1) .

belgelere bakın .


3

Diğer cevaplar datetimeve karşılaştırmalar da tarih olmadan yalnızca zaman için çalışır.

Örneğin, şu anda saat 8: 00'den az mı yoksa az mı olduğunu kontrol etmek için şunları kullanabiliriz:

import datetime

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

Ve daha sonra aşağıdakilerle karşılaştırın:

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

hangisi geri dönecek True


-1

İki tarih farkındaki günleri hesaplamak için aşağıdaki gibi yapılabilir:

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

Çünkü bir saniyenin bitiş tarihi daha fazlaysa,


Soruya cevap vermiyor.
Willwsharp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.