Saya memiliki datetime.datetime
objek Python . Apa cara terbaik untuk mengurangi satu hari?
Saya memiliki datetime.datetime
objek Python . Apa cara terbaik untuk mengurangi satu hari?
Jawaban:
Anda dapat menggunakan objek timedelta :
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
timedelta(minutes=12)
misalnya.
import datetime as DT; DT.datetime.today()
berfungsi pada Python 2 dan 3. Ini sama dengan DT.datetime.now()
.
Jika objek datetime Python Anda mengetahui zona waktu daripada Anda harus berhati-hati untuk menghindari kesalahan di sekitar transisi DST (atau perubahan dalam offset UTC karena alasan lain):
from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal
DAY = timedelta(1)
local_tz = get_localzone() # get local timezone
now = datetime.now(local_tz) # get timezone-aware datetime object
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
naive = now.replace(tzinfo=None) - DAY # same time
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ
Secara umum, day_ago
dan yesterday
mungkin berbeda jika UTC mengimbangi zona waktu lokal telah berubah pada hari terakhir.
Misalnya, waktu musim panas / waktu musim panas berakhir pada Minggu 2-Nov-2014 pukul 02:00:00 di zona waktu America / Los_Angeles jika:
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
kemudian day_ago
dan yesterday
berbeda:
day_ago
tepat 24 jam yang lalu (relatif terhadap now
) tetapi pada jam 11 pagi, bukan pada jam 10 paginow
yesterday
kemarin pukul 10 pagi tetapi 25 jam yang lalu (relatif terhadap now
), bukan 24 jam.pendulum
modul menanganinya secara otomatis:
>>> import pendulum # $ pip install pendulum
>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24) # exactly 24 hours ago
>>> yesterday = now.subtract(days=1) # yesterday at 10 am but it is 25 hours ago
>>> (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]>
Hanya untuk menguraikan metode alternatif dan kasus penggunaan yang sangat membantu:
from datetime import datetime, timedelta print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta
from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5)
Ini juga dapat digunakan dengan parameter lain misalnya detik, minggu, dll
Juga hanya fungsi bagus yang saya suka gunakan ketika saya ingin menghitung yaitu hari pertama / terakhir bulan lalu atau timedeltas relatif lainnya dll ...
Fungsi relativedelta dari fungsi dateutil (ekstensi kuat untuk lib datetime)
import datetime as dt
from dateutil.relativedelta import relativedelta
#get first and last day of this and last month)
today = dt.date.today()
first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
last_day_last_month = first_day_this_month - relativedelta(days=1)
print (first_day_this_month, last_day_last_month)
>2015-03-01 2015-02-28