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