koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da bir tarihten bir gün nasıl çıkarılır?

Bir datetime.datetime nesnemiz olsun. Bu nesneden bir gün çıkarmanın en iyi yolu nedir?

Timedelta nesnesi kullanabilirsiniz:

from datetime import datetime, timedelta
    
d = datetime.today() - timedelta(days=cikarilacak_gun_sayisi)

Saat dilimi duyarlı tarih

Python datetime nesneniz saat dilimine duyarlıysa, DST geçişleri (veya UTC değişiklikleri) ile ilgili hataları önlemek için dikkatli olmanız gerekir:

from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal

DAY = timedelta(1)
local_tz = get_localzone()   # yerel saat dilimi
now = datetime.now(local_tz) # saat dilimi duyarlı datetime nesnesi
day_ago = local_tz.normalize(now - DAY) # tam 24 saat öncesi, saat değişebilir
naive = now.replace(tzinfo=None) - DAY # aynı zaman
yesterday = local_tz.localize(naive, is_dst=None) # ancak geçen zaman değişebilir

Genel olarak, yerel saat dilimi için day_ago (bir gün öncesi) ve yesterday (dün) farklı olabilir.

Örneğin, gün ışığından yararlanma saati/yaz saati 2-Kasım-2014’te Amerika/Los_Angeles saat diliminde 02:00:00’de sona erer.

import pytz # pip install pytz

local_tz = pytz.timezone('America/Los_Angeles')
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
# 2014-11-02 10:00:00 PST-0800

bu durumda day_ago ve yesterday farklı olacaktır:

  • day_ago şimdiye göre tam olarak 24 saat önce ama saat bu sefer 11, 10 değil.
  • yesterday dün saat 10’da ama bu sefer 25 saat önce oldu, 24 saat değil.

pendulum modülü bunu otomatik olarak halleder:

>>> import pendulum  # $ pip install pendulum

>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24)  # tam 24 saat önce
>>> yesterday = now.subtract(days=1)  # dün saat 10'da ama bu sefer 25 saat geçti

>>> (now - day_ago).in_hours()
24
>>> (now - yesterday).in_hours()
25

>>> now
<Pendulum [2014-11-02T10:00:00-08:00]>
>>> day_ago
<Pendulum [2014-11-01T11:00:00-07:00]>
>>> yesterday
<Pendulum [2014-11-01T10:00:00-07:00]>

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top